2013-11-10 4 views
0

Я новичок в Lisp, и мне трудно понять, как добавить список в другой список. Я начинаю с пустого списка, и мне нужно добавить новые списки, каждый из которых содержит три элемента. Например,Добавить списки в список lisp

(add '(1 2 3) '())

вернуться бы ((1 2 3)) [назовем его нового списка], и добавив новый список этого нового, например

(add '(4 5 6) new-list)

вернется ((1 2 3) (4 5 6)) или ((4 5 6) (1 2 3))

Я пробовал несколько разных способов, но до сих пор ближайший я придумал ((((1 2 3)) (4 5 6)) (7 8 9))

я использовал что-то вроде этого:

(defun add (lst new-let) (if (null lst) '() (setf new-lst (cons new-lst (cons lst '()))))

+1

Я не совсем понимаю, почему первый вызов будет возвращать '((1 2 3))' вместо '((1 2 3)())'. Явный специальный случай? –

+0

@ JB .: Нет, я думаю, это не имеет большого значения. Мое главное сомнение в том, как избавиться от такого рода вложенных списков ... –

ответ

1

Вы пробовали:

(defun add (thing lst) (append lst (list thing))) 

Я не пробовал это с Common Lisp, как я больше Схемы такого парня , бу, я думаю, это сработает.

+0

Да, отлично работает, спасибо за помощь! –

1

Способ, которым я его читал, в точности равен cons (не разрушительный) или push (деструктивный).

+0

За исключением того, что вы не можете '(push '(1 2 3)'())', а в '(defun add (x y) (push x y))' только модифицирует 'y', а не список, который он содержит. То есть, ((a (список 1 2 3)) (b (список 4 5 6))) (добавить ab) b) 'возвращает' (4 5 6) ', а не' ((1 2 3) (4 5 6)) 'или' ((1 2 3) 4 5 6) '. –

+0

Привет, семантическое педантизм. Очевидно, что деструктивная версия должна использоваться на месте, а дефрагментация 'add' поверх нее избыточна. Цель достаточно ясна. Я связан с документацией. –

0

Вы новичок в LISP Я бы хотел дать вам альтернативу принятому ответу.

Списки - это цепочки с одиночными ссылками. Такая структура позволяет добавлять и удалять спереди, чтобы быть постоянной операцией времени, в то время как добавление или удаление чего-либо из конца займет столько же раз, сколько элементов в списке как во времени, так и в пространстве (ему придется воссоздать структуру списка на это путь).

(defun add (element list) 
    (cons element list)) 

Это выглядит очень знакомо .. Это на самом деле просто обертка для cons. Итак, представьте себе, что у вас есть практическое приложение, в котором вы хотели бы использовать add, но вам нужны элементы в порядке в вашем вопросе. Один из способов сделать это должен был бы закончить сначала (добавить что добавить), затем сделать один reverse или nreverse (если каждый элемент был выполнен в вашей функции, и мутация не имеет значения для снаружи).

(defun fetch-all (num-elements thunk &optional acc) 
    (if (zerop num-elements) 
     (nreverse acc) 
     (fetch-all (- num-elements 1) thunk (add (funcall thunk) acc)))); add == cons 
Смежные вопросы