List 在LISP中创建作为参数传递给函数的列表列表

List 在LISP中创建作为参数传递给函数的列表列表,list,lisp,common-lisp,List,Lisp,Common Lisp,我正在用LISP编写一个代码,从用户那里获取3个不同的列表作为函数的参数,然后我想创建这些列表的新列表。。我尝试过简单的编码,但它没有给我想要的输出 以下是我编写的代码: (defun demo(n1 n2 n3) (setq list1 '(n1 n2 n3)) (print list1)) CL-USER 12 : 5 > (demo '(1 2 3) '(4 5 6) '(7 8 9)) (N1 N2 N3) (N1 N2 N3) 当我运行此代码时,它不是给出列表列表,

我正在用LISP编写一个代码,从用户那里获取3个不同的列表作为函数的参数,然后我想创建这些列表的新列表。。我尝试过简单的编码,但它没有给我想要的输出

以下是我编写的代码:

(defun demo(n1 n2 n3)
  (setq list1 '(n1 n2 n3))
  (print list1))

CL-USER 12 : 5 > (demo '(1 2 3) '(4 5 6) '(7 8 9))
(N1 N2 N3) 
(N1 N2 N3)
当我运行此代码时,它不是给出列表列表,而是给我输出:

(n1 n2 n3)
期望输出为

((1 2 3) (4 5 6) (7 8 9))

你得到了一个文字列表,因为你引用了它。您需要引用函数调用中的变量来创建新列表

(defun demo (n1 n2 n3)
  (let ((list1 (list n1 n2 n3)))
    (print list1)))
您也可以使用反向报价:

(defun demo (n1 n2 n3)
  (let ((list1 `(,n1 ,n2 ,n3)))
    (print list1)))

您还应该使用
let
绑定局部变量,而不是使用
setq

分配全局变量。此函数已经存在。它被称为
list
@vikram如果这个答案对你有效,那么你应该这样做。如果你需要评估每个元素,为什么你会选择使用反引号?我相信对于一个还不知道引用这个概念的OP来说,这可能会令人困惑。我只是展示了不同的做事方式。反引号非常有用,因为它允许您以类似于查看文字列表的方式在代码中显示数据结构。