函数的意外结果(递归)

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.

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

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