我需要实现从传递给函数的参数创建列表的函数。
这是我的代码:
(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
答案 0 :(得分:5)
<强>风格强>
请使用标准的Lisp格式。使用编辑器可以帮助您缩进Lisp代码。
不要将括号单独放在一行上。这只是浪费空间而没有任何好处。
较长的名称在-
之间得到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
函数,该函数已经创建了一个args列表:
(setf (symbol-function 'list-builder)
#'list)
答案 1 :(得分:4)
您需要使用(apply #'lstbuilder (cdr args))
来“展开”列表的内容作为函数调用参数。