我编写了这样的功能来反转列表
练习2.18。定义一个过程反向,以列表作为参数并以相反的顺序返回相同元素的列表:
#+begin_src emacs-lisp :session sicp :lexical t
(defun reversex(item)
(cond
((null item) nil)
((cons (reversex (cdr item))
(car item)))
))
(reversex (list 1 4 9 16 25))
#+end_src
第一次运行时得到以下输出:
#+RESULTS:
: (((((nil . 25) . 16) . 9) . 4) . 1)
但是第二次运行,出现错误:
Wrong argument type listp, "GIF"
尚不清楚“ GIF”来自何处,因为您没有提供您提到的“第二轮”的输入。无论如何,您用于反转列表的算法是不正确的,您应该构建一个proper list作为输出,不是吗:
(((((nil . 25) . 16) . 9) . 4) . 1)
应该看起来像这样:
'(25 . (16 . (9 . (4 . (1 . nil)))))
这里是一种方法-使用累加器参数。还请注意应如何编写else
的cond
条件:
(defun reversex (lst acc)
(cond
((null lst) acc)
(t (reversex (cdr lst) (cons (car lst) acc)))))
(reversex '(1 4 9 16 25) nil)
=> (25 16 9 4 1)