Lisp 为什么(列出';引号';x)的值为';而不是(';x)或(';x)?

Lisp 为什么(列出';引号';x)的值为';而不是(';x)或(';x)?,lisp,common-lisp,evaluation,quote,clisp,Lisp,Common Lisp,Evaluation,Quote,Clisp,我正在尝试学习LISP,并正在经历一个代码示例,其中使用了类似于以下代码的内容: (列表报价5) 这在REPL中计算为“5”。我希望它评估为('5)或(引用5) 我正在CLISP REPL中尝试这个 任何帮助都将不胜感激。读取-评估打印循环首先读取,然后评估 'quote被理解为“名称为quote的符号” 5读作“数字5” 因此(列表的引号5)被评估为“制作一个列表,其第一个元素是名称为引号的符号,第二个元素是5” 此评估的结果可以写为“(引号5)”。“'5”是另一种说法,一些(可能是大多数)l

我正在尝试学习LISP,并正在经历一个代码示例,其中使用了类似于以下代码的内容:

(列表报价5)

这在REPL中计算为“5”。我希望它评估为('5)或(引用5)

我正在CLISP REPL中尝试这个


任何帮助都将不胜感激。

读取-评估打印循环首先读取,然后评估

'quote被理解为“名称为quote的符号”

5读作“数字5”

因此(列表的引号5)被评估为“制作一个列表,其第一个元素是名称为引号的符号,第二个元素是5”

此评估的结果可以写为“(引号5)”。“'5”是另一种说法,一些(可能是大多数)lisp实现中的打印机会选择打印较短的表单,而不是较长的表单

当你在repl上打字学习这些东西时,你需要记住这一点 阅读和评估的两个步骤是不同的,但循环同时执行这两个步骤

试一试

一次只做一步,或

* (first (read-from-string "(quote 5)"))
QUOTE
* (second (read-from-string "(quote 5)"))
5
* (read-from-string "(quote 5)")
'5

让自己相信“(引号5)”和“'5”是同一件事

难道“5”不只是(引号5)的语法捷径吗?请注意,我的LISP体验在很多月前仅限于Scheme和Emacs LISP…哈哈,stackoverflow语法着色并不是真正按照LISP语法设置的…谢谢你的回答,我想我现在明白了。是的,它是在猜测模式下的prettify.js,这是非常狭隘的。尽管meta.stackoverflow.com上有许多投诉和建议,但这个问题已经被忽视了一年多。
* (first (read-from-string "(quote 5)"))
QUOTE
* (second (read-from-string "(quote 5)"))
5
* (read-from-string "(quote 5)")
'5