在Lisp(Clojure,Emacs Lisp)中,列表和引号之间有什么区别? 从LISP阅读介绍材料,我现在认为以下是相同的: (list 1 2 3) '(1 2 3)

在Lisp(Clojure,Emacs Lisp)中,列表和引号之间有什么区别? 从LISP阅读介绍材料,我现在认为以下是相同的: (list 1 2 3) '(1 2 3),list,clojure,lisp,elisp,quote,List,Clojure,Lisp,Elisp,Quote,然而,从我在Clojure和Emacs Lisp中使用引用表单时遇到的问题来看,它们并不相同。你能告诉我区别是什么吗?引用列表(例如,”(1 2 3))应谨慎对待(通常为只读)。(参见SO答案和) (列表1、2、3)将独立于所有其他列表,创建一个新列表 您可以看到在中使用引用列表的陷阱示例 而且,正如您可能知道的,当您调用'list时,参数显然会根据引用列表的内容进行计算。而'quote只接受一个参数,而'list的参数数量是可变的 (list (+ 1 2) 3) --> (3

然而,从我在Clojure和Emacs Lisp中使用引用表单时遇到的问题来看,它们并不相同。你能告诉我区别是什么吗?

引用列表(例如,
”(1 2 3)
)应谨慎对待(通常为只读)。(参见SO答案和)

(列表1、2、3)
将独立于所有其他列表,创建一个新列表

您可以看到在中使用引用列表的陷阱示例

而且,正如您可能知道的,当您调用
'list
时,参数显然会根据引用列表的内容进行计算。而
'quote
只接受一个参数,而
'list
的参数数量是可变的

(list (+ 1 2) 3)     -->  (3 3)
(quote ((+ 1 2) 3))  -->  ((+ 1 2) 3)

在公共Lisp中,带引号的对象是常量文字数据。您不应修改此数据,因为其后果尚未定义。可能的后果是:修改共享数据,尝试修改只读数据,可能会发出错误信号,可能会正常工作

有关列表:

'(1 2 3)
上面是一个常量列表,它将由读者自行构建和评估,因为它是引用的。如果它出现在Lisp代码中,编译器将以某种方式将该数据嵌入FASL代码中

(quote(1233))
是另一种编写方法

(list 1 2 3)
这是对公共Lisp函数
LIST
的调用,其中包含三个参数
1
2
3
。当评估结果时,会出现一个新的列表
(1 2 3)

类似的:

'(1 . 2)   and  (cons 1 2)

'#(1 2 3)  and  (vector 1 2 3)

一个是文本数据,另一个是构造这种数据结构的函数调用

主要区别在于
quote
阻止对元素进行评估,而
list
不:

user=> '(1 2 (+ 1 2)) (1 2 (+ 1 2)) user=> (list 1 2 (+ 1 2)) (1 2 3) 用户=>'(12(+12)) (1 2 (+ 1 2)) 用户=>(列表12(+12)) (1 2 3) 出于这个原因(除其他原因外),在描述文字集合时使用向量是clojure的惯用用法:

user=> [1 2 (+ 1 2)] [1 2 3] 用户=>[12(+12)] [1 2 3]
它们之间的关系可以类似于使用“function name”和
funcall
调用函数

当您不知道在运行时将得到什么函数时,可以使用
funcall

当您不知道在运行时可以得到什么元素时,可以使用
列表


对于像我这样的人,他们因为存在
backquote
而感到困惑,并将其默认为quote

backquote
不是
quote

它是一个读卡器宏,可扩展为
quote
list
或其他:

(macroexpand ''(1 2));=> '(1 2)
(macroexpand '`(1 2));=> '(1 2)
(macroexpand '`(1 ,2));=> (list 1 2)
(macroexpand '`(1 ,@foo));=> (cons 1 foo)
(macroexpand '`(1 ,@foo 2));=> (cons 1 (append foo '(2)))

我喜欢你指出他们的“签名”之间的区别,论点的数量。事实上,他们是相似的。看看我的问题。这个答案似乎不诚实,因为它没有提到
(列表12'(+12))
仍然是一个列表,但第三个元素未被计算,但它不表示
'(12(+12))
(列表'1'2'(+12))之间的差异。