错误的参数类型listp,“ GIF”,当反转列表时

问题描述 投票:0回答:1

我编写了这样的功能来反转列表

练习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"
elisp sicp
1个回答
0
投票

尚不清楚“ GIF”来自何处,因为您没有提供您提到的“第二轮”的输入。无论如何,您用于反转列表的算法是不正确的,您应该构建一个proper list作为输出,不是吗:

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

应该看起来像这样:

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

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

(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)
© www.soinside.com 2019 - 2024. All rights reserved.