(defun test(n x)
(let* (d (append (list n) x)))
(if (= n 0) d
(test (- n 1) d)))
所以这是我用 lisp 编写的基本测试函数。该函数应该接受一个数字(n)和一个列表(x),并将 n 和 0 之间的每个数字附加到返回的列表中。但是,当我运行它时,例如
(test 4 NIL)
它说
bad binding form: (APPEND (LIST N) X)
基本上我的问题是如何将 append 的返回调用存储到 Lisp 中的变量中?
最佳答案
您缺少围绕绑定(bind)的括号,并且您的代码不在 let*
的主体中,而是使 d
成为特殊的全局变量。你应该得到一个警告。由于您只使用一个绑定(bind),因此无需使用 let*
而不是 let
。
(defun test (n x)
(let ((d (append (list n) x)))
(if (= n 0)
d
(test (- n 1) d))))
请注意,由于您要将元素添加到列表的开头,因此您应该使用 cons
而不是 append
+ list
,如下所示:
(defun test (n x)
(let ((d (cons n x)))
(if (= n 0)
d
(test (- n 1) d))))
我还注意到,如果您的基本案例更进一步,您就不需要绑定(bind):
(defun make-range (to &optional (acc '()))
"Makes a list of the elements from 0 to to"
(if (< to 0)
acc
(make-range (- to 1) (cons to acc)))))
(make-range 5)
; ==> (0 1 2 3 4 5)
关于lisp - 如何在 Lisp 变量中保存追加返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42236597/