Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/10: Рейтинг темы: голосов - 10, средняя оценка - 4.70
DroidAn
7 / 7 / 0
Регистрация: 18.11.2011
Сообщений: 150
#1

Короткие списки в Lisp

23.02.2012, 17:10. Просмотров 1788. Ответов 16
Метки нет (Все метки)

Здравствуйте, все! Мужчины, поздравляю вас с праздником!
Подскажите, что такое "короткие" списки в лиспе?

Заранее большое спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2012, 17:10
Ответы с готовыми решениями:

Списки Lisp
Определить количество подсписков, находящихся на указанном уровне для...

Списки Lisp
Из заданного списка ( a (b (c) d (( e ((f))))) получить список ( f b (a))...

Списки Lisp
Нужна помощь ! Написать программу подсчета количества атомов в заданном...

Вложенные списки Lisp
Добрый вечер. Помогите пожалуйста. Дан список ((1 (a 4 b 6) c) 9 d ... )....

списки свойств в lisp
Здравствуйте. Помогите пожалуйста с решением задачи: Напишите функцию, которая...

16
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
23.02.2012, 17:36 #2
В первый раз слышу. Может быть, имелись в виду списки типа dotted list?
1
DroidAn
7 / 7 / 0
Регистрация: 18.11.2011
Сообщений: 150
23.02.2012, 17:47  [ТС] #3
Возможно, но скорее всего имелось в виду список из небольшого количества элементов.)

Скажите, я недавно начал изучать lisp, скачал компилятор от UfaSoft, но не пойму, почему там не работает функция lisp (оболочка не воспринимает его как ключевое слово). А компилятор выдаёт ошибку.

Заранее спасибо за совет.)
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
23.02.2012, 17:49 #4
Цитата Сообщение от DroidAn Посмотреть сообщение
Возможно, но скорее всего имелось в виду список из небольшого количества элементов
ну это слишком очевидно☺

Цитата Сообщение от DroidAn Посмотреть сообщение
Скажите, я недавно начал изучать lisp, скачал компилятор от UfaSoft, но не пойму, почему там не работает функция lisp
нет такой функции (если, конечно, мы говорим про Common Lisp). Есть функция list
1
DroidAn
7 / 7 / 0
Регистрация: 18.11.2011
Сообщений: 150
23.02.2012, 21:46  [ТС] #5
Прошу прощения, опечатался. Конечно речь о функции list. Но в студии она просто не подсвечивается, как ключевое слово, поэтому возникла непонятка)

Скажите, я пытаюсь передать в функцию два списка в качестве параметров, как лучше это сделать? То есть пытаюсь передать в параметр список, элементы которого - два списка:
Lisp
1
defun MyFunc (list (list a1 b1 c1) (list a2 b2 c2))
Компилятор ругается на это.

Вообще ещё думаю про такой вариант: можно в функцию передать два атома, но в качестве фактических параметров уже передать списки:
Lisp
1
defun MyFunc (a b)
Как сделать лучше?
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
24.02.2012, 05:03 #6
Цитата Сообщение от DroidAn Посмотреть сообщение
Компилятор ругается на это
потому, что синтаксис определения неправильный. В кратком виде (или тут):
Lisp
1
(defun funid arglist body)
где funid — имя, которое мы даем новой функции, arglist — это (возможно, пустой) список аргументов функции, а
body — это последовательность форм, представляющих неявный progn
Например:
Lisp
1
2
3
4
5
;; funid   = my-func
;; arglist = (a b)
;; body    = (list a b)
(defun my-func (a b)
  (list a b))
1
DroidAn
7 / 7 / 0
Регистрация: 18.11.2011
Сообщений: 150
24.02.2012, 13:07  [ТС] #7
Ага. То есть в качестве аргументов в функцию можно передать только атомы, а в теле функции из атомов формировать список. Список передать нельзя. Я Вас верно понял?
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
24.02.2012, 13:40 #8
Цитата Сообщение от DroidAn Посмотреть сообщение
То есть в качестве аргументов в функцию можно передать только атомы, а в теле функции из атомов формировать список. Список передать нельзя. Я Вас верно понял?
нет, в функцию можно передать любой объект Lisp
1
DroidAn
7 / 7 / 0
Регистрация: 18.11.2011
Сообщений: 150
24.02.2012, 23:05  [ТС] #9
Скажите, а как объявить вторую переменную внутри тела функции?

С одной переменной работает:
Lisp
1
2
3
4
(defun funcc(a1 b1 c1 a2 b2 c2) (
            setf firstList (list a1 b1 c1)
            ;setf secondList (list a2 b2 c2)
            ))
На вторую переменную (secondList) ругается.
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
25.02.2012, 03:56 #10
Цитата Сообщение от DroidAn Посмотреть сообщение
Скажите, а как объявить вторую переменную внутри тела функции?
объявление лексических переменных происходит с помощью конструкции let; setf — это конструкция для присваивания.
Lisp
1
2
3
4
(defun funcc (a1 b1 c1 a2 b2 c2)
  (let ((first-list (list a1 b1 c1))
    (second-list (list a2 b2 c2)))
    (append first-list second-list)))
Цитата Сообщение от DroidAn Посмотреть сообщение
На вторую переменную (secondList) ругается.
скобок не хватает
1
DroidAn
7 / 7 / 0
Регистрация: 18.11.2011
Сообщений: 150
25.02.2012, 10:50  [ТС] #11
Большое спасибо! А append добавляет второй список к концу первого?
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
25.02.2012, 10:57 #12
DroidAn, да
1
DroidAn
7 / 7 / 0
Регистрация: 18.11.2011
Сообщений: 150
26.02.2012, 01:53  [ТС] #13
Скажите ещё пожалуйста, я пытаюсь построить список из первого элемента первого списка и последнего элемента второго списка (firstOutput). Почему-то в консоли выводится ошибка.

Lisp
1
2
3
4
5
6
(defun main ()  
(defun funcc (a1 b1 c1 a2 b2 c2)
  (let ((firstList (list a1 b1 c1))
        (secondList (list a2 b2 c2))
        (firstOutput (list first firstList cdr secondList))
        )) firstOutput)
0
transformator.t
defun
596 / 610 / 44
Регистрация: 30.04.2011
Сообщений: 696
26.02.2012, 02:11 #14
Lisp
1
2
3
4
5
6
7
8
9
(defun f (lst1 lst2)
           (list (car lst1)
                 (car (last lst2))))
 
(defun f (lst1 lst2)
           (if (null (cdr lst2))
             (list (car lst1)
                   (car lst2))
             (f lst1 (cdr lst2))))
1
DroidAn
7 / 7 / 0
Регистрация: 18.11.2011
Сообщений: 150
26.02.2012, 10:22  [ТС] #15
Ага. Спасибо! А есть в лиспе функции, которые позволяют доставать например, второй, третий, десятый элементы? (при условии, что количество элементов списка может быть разным)
0
transformator.t
defun
596 / 610 / 44
Регистрация: 30.04.2011
Сообщений: 696
26.02.2012, 10:34 #16
ну есть же;
first second third fourth и т.д.
1
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
26.02.2012, 11:31 #17
Еще nth, c(a|d)r
1
26.02.2012, 11:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2012, 11:31

Списки. GNU Common Lisp
1) сформировать список L1 из элементов: произведение всех элементов исходного...

GNU Common Lisp. списки
Здравствуйте. помогите решить задачу написать программу, реализующую...

Lisp списки , разбиение на два списка
Дан список целых чисел , необходимо разбить на два списка, поместив в первый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru