函数的意外结果(递归)

时间:2015-09-04 22:30:52

标签: lisp common-lisp

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

这是我的代码:

(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

2 个答案:

答案 0 :(得分: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)))))

由于args变量已经是一个列表,我们可以复制它:

(defun list-builder (&rest args)
  (copy-list args))

或者我们可以重用list函数,该函数已经创建了一个args列表:

(setf (symbol-function 'list-builder)
      #'list)

答案 1 :(得分:4)

您需要使用(apply #'lstbuilder (cdr args))来“展开”列表的内容作为函数调用参数。