我需要实现从传递给函数的参数创建列表的函数.
这是我的代码:
(defun lstbuilder (&rest args)
(if (eq (car args) NIL)
NIL
(cons (car args)
(lstbuilder (cdr args)))))
Run Code Online (Sandbox Code Playgroud)
此功能无法正常工作.结果:
(lstbuilder 'a 'b 'c 'd 'e) ;expected (a b c d e)
(a (b c d e)) ;result
Run Code Online (Sandbox Code Playgroud)
样式
请使用标准的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)))))
Run Code Online (Sandbox Code Playgroud)
由于args变量已经是一个列表,我们可以复制它:
(defun list-builder (&rest args)
(copy-list args))
Run Code Online (Sandbox Code Playgroud)
或者我们可以重用该list函数,该函数已经创建了一个args列表:
(setf (symbol-function 'list-builder)
#'list)
Run Code Online (Sandbox Code Playgroud)