在Lisp(Clojure,Emacs Lisp)中,列表和引号之间有什么区别? 从LISP阅读介绍材料,我现在认为以下是相同的: (list 1 2 3) '(1 2 3)
然而,从我在Clojure和Emacs Lisp中使用引用表单时遇到的问题来看,它们并不相同。你能告诉我区别是什么吗?引用列表(例如,在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
”(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))之间的差异。