Lisp не переворачивает мои списки

Я делаю домашнюю работу на Лиспе, используя 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))))))

Я новичок в Lisp, но этот код вообще не переворачивает 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), почему она не реверсирует для первого оператора печати? Я что-то упускаю?


person ToastyMallows    schedule 11.01.2012    source источник
comment
(null thelist) более идиоматичен, чем (equal thelist nil) в Common Lisp.   -  person Iceland_jack    schedule 18.01.2012


Ответы (1)


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

Я думаю, ты хочешь (nreverse).

person ᆼᆺᆼ    schedule 11.01.2012
comment
Ах, хорошо, значит, он переворачивает (BC), потому что, когда он возвращает список, он на самом деле идет куда-то еще в коде (т.е. - переворачивает все)? - person ToastyMallows; 11.01.2012
comment
Да, он просто печатает thelist, что в данном случае является результатом (reverse (first thelist)) - person ᆼᆺᆼ; 11.01.2012
comment
Круто, большое спасибо, я действительно запутался там на секунду. - person ToastyMallows; 11.01.2012
comment
Так или иначе, вы хотите, чтобы в начале вместо (reverse thelist) что-то вроде (nreverse thelist) - person ᆼᆺᆼ; 11.01.2012
comment
Да, я уже внес изменения, теперь все работает гладко. Спасибо. - person ToastyMallows; 11.01.2012
comment
Я думаю, стоит отметить, что даже для таких функций, как (nreverse thelist), которые изменяют список на месте, вы должны использовать возвращаемое значение (например, (let ((x (list 1 2 3))) (setf x (nreverse x)))). - person Hugh; 11.01.2012