参数类型 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)))))
这是一种方法 - 使用累加器参数。另请注意 cond
的 else
条件应如何编写:
(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)
我写了这样一个函数来反转列表
练习 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)))))
这是一种方法 - 使用累加器参数。另请注意 cond
的 else
条件应如何编写:
(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)