参数类型 listp 错误,"GIF" 反转列表时

Wrong argument type listp, "GIF" When reverse a list

我写了这样一个函数来反转列表

练习 2.18。定义一个过程 reverse,它将一个列表作为参数,returns 一个相同元素的列表以相反的顺序排列:

#+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" 的来源,因为您没有为您提到的 "second run" 提供输入。不管怎样,你的反转列表的算法是不正确的,你应该构建一个 正确的列表 作为输出,但不是这样:

(((((nil . 25) . 16) . 9) . 4) . 1)

它应该是这样的:

'(25 . (16 . (9 . (4 . (1 . nil)))))

这是一种方法 - 使用累加器参数。另请注意 condelse 条件应如何编写:

(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)