函数的意外结果(递归)
Unexpected result of the function (recursion)
我需要实现根据传递给函数的参数创建列表的函数。
这是我的代码:
(defun lstbuilder (&rest args)
(if (eq (car args) NIL)
NIL
(cons (car args)
(lstbuilder (cdr args)))))
此功能无法正常工作。
结果:
(lstbuilder 'a 'b 'c 'd 'e) ;expected (a b c d e)
(a (b c d e)) ;result
您需要使用 (apply #'lstbuilder (cdr args))
才能 "splat" 列表的内容作为函数调用参数。
风格
请使用标准的 Lisp 格式。使用编辑器将帮助您缩进 Lisp 代码。
不要将括号单独放在一行中。这只是浪费space,没有任何好处。
较长的名称在单词之间添加 -
:list-builder
.
不要使用 car
和 cdr
进行列表操作。使用 first
和 rest
.
列表测试结束是endp
。
示例:
(defun list-builder (&rest args)
(if (endp args)
nil
(cons (first args)
(apply #'list-builder (rest args)))))
由于args
变量已经是一个列表,我们可以复制它:
(defun list-builder (&rest args)
(copy-list args))
或者我们可以重用 list
函数,它已经创建了一个参数列表:
(setf (symbol-function 'list-builder)
#'list)
我需要实现根据传递给函数的参数创建列表的函数。
这是我的代码:
(defun lstbuilder (&rest args)
(if (eq (car args) NIL)
NIL
(cons (car args)
(lstbuilder (cdr args)))))
此功能无法正常工作。 结果:
(lstbuilder 'a 'b 'c 'd 'e) ;expected (a b c d e)
(a (b c d e)) ;result
您需要使用 (apply #'lstbuilder (cdr args))
才能 "splat" 列表的内容作为函数调用参数。
风格
请使用标准的 Lisp 格式。使用编辑器将帮助您缩进 Lisp 代码。
不要将括号单独放在一行中。这只是浪费space,没有任何好处。
较长的名称在单词之间添加
-
:list-builder
.不要使用
car
和cdr
进行列表操作。使用first
和rest
.列表测试结束是
endp
。
示例:
(defun list-builder (&rest args)
(if (endp args)
nil
(cons (first args)
(apply #'list-builder (rest args)))))
由于args
变量已经是一个列表,我们可以复制它:
(defun list-builder (&rest args)
(copy-list args))
或者我们可以重用 list
函数,它已经创建了一个参数列表:
(setf (symbol-function 'list-builder)
#'list)