【问题标题】:How to save append return in Lisp variable?如何在 Lisp 变量中保存附加返回?
【发布时间】:2017-02-14 21:30:14
【问题描述】:
(defun test(n x)
   (let* (d (append (list n) x)))
   (if (= n 0) d
      (test (- n 1) d)))

所以这是我用 lisp 编写的一个基本测试函数。该函数应该接受一个数字(n)和一个列表(x),并将n和0之间的每个数字附加到一个返回的列表中。但是,当我运行它时,例如

(test 4 NIL)

它说

错误的绑定形式:(APPEND (LIST N) X)

基本上我的问题是如何将 append 的返回调用存储到 Lisp 中的变量中?

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    您在绑定周围缺少括号,并且您的代码不在let* 的主体中,而是在将d 设置为特殊的全局变量之外。你应该得到一个警告。由于您只使用一种绑定,因此无需使用let* 而不是let

    (defun test (n x)
      (let ((d (append (list n) x)))
        (if (= n 0)
            d
            (test (- n 1) d))))
    

    请注意,由于您要将元素添加到列表的开头,因此您应该使用 cons 而不是 append + list,如下所示:

    (defun test (n x)
      (let ((d (cons n x)))
        (if (= n 0)
            d
            (test (- n 1) d))))
    

    我还注意到,如果您的基本情况更进一步,您就不需要绑定:

    (defun make-range (to &optional (acc '()))
      "Makes a list of the elements from 0 to to"
      (if (< to 0)
          acc
          (make-range (- to 1) (cons to acc)))))
    
    (make-range 5)
    ; ==> (0 1 2 3 4 5)
    

    【讨论】:

    • 在递归调用中也重命名函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多