lisp - 如何在 Lisp 变量中保存追加返回?

标签 lisp common-lisp

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

它说

bad binding form: (APPEND (LIST N) X)

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

最佳答案

您缺少围绕绑定(bind)的括号,并且您的代码不在 let* 的主体中,而是使 d 成为特殊的全局变量。你应该得到一个警告。由于您只使用一个绑定(bind),因此无需使用 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))))

我还注意到,如果您的基本案例更进一步,您就不需要绑定(bind):

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

关于lisp - 如何在 Lisp 变量中保存追加返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42236597/

相关文章:

lambda - 如何在 lisp 中本地定义一个函数?

java - 如何使用 armed bear common lisp 创建一个 jar?

Lisp 列表线性化与 map

lisp - 常见的 lisp 函数/特殊形式/宏/等是什么。名字的意思,我在哪里可以找到这些信息?

lisp - 使用 Lisp : Passing a function to mapcar? 进行高阶编程

recursion - 以下递归函数的非递归函数是什么?

lisp - 如何在普通 lisp 中从一个奇数对和偶数对的单个列表创建列表列表

sql - 我如何传递这个论点?

haskell - 采用函数式语言的 Kernighan & Ritchie 字数统计示例程序

Lisp 列表打印