Лисп не меняет мои списки - PullRequest
3 голосов
/ 11 января 2012

Я делаю домашнюю работу на Лиспе, использую для тестирования clisp, загружаю этот код и работаю в clisp

(defun myreverse (thelist)

(reverse thelist)
(print thelist)

(if (equal thelist nil)
    nil
    (if (consp (first thelist))
            (cons (myreverse (reverse (first thelist))) 
                (myreverse (reverse (rest thelist))))
            (cons (first thelist) (myreverse (rest thelist))))))

Я новичок в Лиспе, но этот кодне меняет thelist, мой вывод:

[18]> (myreverse '(a (b c) d))

(A (B C) D)
((B C) D)
(C B)
(B)
NIL
(D)
NIL
(A (C B) D)

В первой строке моего кода написано (reverse thelist), почему это не реверс для первого оператора печати?Я что-то упустил?

1 Ответ

4 голосов
/ 11 января 2012

Я считаю, что (обратный) не имеет побочных эффектов, поэтому он не меняет исходный список, но возвращает новый, полностью измененный.Это не так естественно в Common Lisp, но ожидается в Схеме.Тем не менее, вот документ http://www.lispworks.com/documentation/HyperSpec/Body/f_revers.htm#reverse

...