2016-02-09 1 views
0

Эй, ребята, я пытаюсь сломать сложную проблему, и возможность добавить элемент без создания списка в списке сделает проблему намного проще. Я сделал тонну поисковой системы и не могу найти упоминания о функции добавления в общем-вестнике. Я должен также упомянуть, что я пытаюсь добавить его в конец списка.Есть ли функция добавления (в список) для sbcl-based common-lisp?

-Я видел макрос push, но это не скомпилировано по любой причине. Я получаю вызов нелегальной функции.

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

-Использование списка создаст ту же проблему, что и минусы, потому что я еще раз получу слоистые списки.

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

+0

Показать код или вам не поможет. Я понятия не имею, как вам удалось вызвать незаконный вызов функции с помощью 'push'. – Svante

ответ

2

Я считаю, что вы ищете приложение.

CL-USER> (append '(:a :b :c) '(1 2 3)) 
(:A :B :C 1 2 3) 

http://www.lispworks.com/documentation/HyperSpec/Body/f_append.htm#append

+0

Не знал, что эта функция доступна. Класс, который я принимаю, имеет печально известного профессора и ужасную книгу. Спасибо, что ответили на мой простой вопрос. – Xuluu

+3

@ user3622073 общий lisp задокументирован в свободно доступном [гиперспец] (http://www.lispworks.com/documentation/HyperSpec/Front). Он большой, но доступный, и мы организуем его. Просмотр будет полезен вам. –

+2

@ user3622073 Есть также несколько книг, доступных для бесплатного онлайн, то есть [Практические общие Lisp] (http://gigamonkeys.com/book/) и [Common Lisp: Нежное введение в символические вычисления] (http: // www.cs.cmu.edu/~dst/LispBook/). – Pascal

1

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

Например, если я где создать функцию, чтобы создать диапазон как список я мог бы сделать это:

(defun make-range (from to result) 
    (if (<= from to) 
    (make-range (1+ from) to (cons from result)) 
    result)) 

Но это привело бы в обратном направлении в диапазоне:

* (make-range 1 5()) 
(5 4 3 2 1) 

Однако , исправление это так же просто, как изменить список, когда я закончил его.

(defun make-range2 (from to result) 
    (if (<= from to) 
    (make-range2 (1+ from) to (cons from result)) 
    (reverse result))) 

* (make-range2 1 5()) 
(1 2 3 4 5) 

реверса список раз во многих случаях накладные расходы, мы можем жить, и то, что вы видите много в функциональном программировании.

Смежные вопросы