函数的意外结果(递归)

Ale*_*ryk 3 lisp common-lisp

我需要实现从传递给函数的参数创建列表的函数.

这是我的代码:

(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)

Rai*_*wig 5

样式

  • 请使用标准的Lisp格式.使用编辑器将帮助您缩进Lisp代码.

  • 不要将括号单独放在一条线上.这只是浪费空间而没有任何好处.

  • 更长的名字-在两个词之间得到:list-builder.

  • 不要使用carcdr列表操作.使用firstrest.

  • 列表测试结束了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)

  • @PuercoPop:实际上这是LispWorks中的默认缩进样式. (2认同)
  • @PuercoPop:也许它提供了更多的视觉线索.顺便说一句,在Zmacs中,可以缩进然后旋转几个缩进替代品. (2认同)