关于 quote 的疑惑

我在看 Quote 使用的例子,其中'(quote foo) ⇒ 'foo 可是 quote 为啥变成引号了?同样 '(print "hello") ⇒ (print "hello") 是quote 有什么特殊吗,quote 的意思我是能理解,请求 quote 这个函数有什么特殊吗?

quote',所以 '(quote foo) 等同于 ''foo,求值之后消掉一个 quote,所以结果是 'foo

2 个赞

意思就是它就是一种语法。不是一个函数?

'xxx 的写法等价于 (quote xxx), 你可以说 'xxx 是 quote 函数的一种写法, 好比 python 里写个列表你可以用 list([1,2,3]), 也可以直接写 [1 2 3]

' 这个符号在 common lisp 里是个 reader macro,emacs lisp 里是个 special case。也就是所谓语法糖。

我大概知道了,我看 info 帮助里面 quote 是一个 Special Forms 和 if 这些是一样的

我刚看了一下SICP第一章,这里是不是涉及到正则序或者应用序的概念

quote相当于就是不展开求值,是这个意思吗?

1 个赞

就好像代码中,1 会解释为数字 1,"abc" 会创建字符串 “abc” 一样,(quote xyz) 会在执行时被当作 symbol xyz,或者说,符号 xyz,而 (quote (abc def)) 会转为列表 (abc def),这里 abc、def 也都是符号。

不论是 python 或 c 中的字符串 "1 + 2 + 3",还是 lisp 的字符串 "(+ 1 2 3)",得到的结果都是没有对字符串内容求值的原先的值,前者还是 “1 + 2 + 3”,后者也还是 “(+ 1 2 3)”,不会说运行的时候字符串变成 “6” 了。quote 也是如此,(quote (+ 1 2)) 得到的结果就是列表 (+ 1 2),永远也不会是 3。

更多细节上的内容,详见

说到 symbol,symbol是不是就是结构体变量?

不是。symbol 就是符号,是变量、函数之类的名字,或者用户自己赋予意义的标记。后者就好像 c/rust 里的 enum。c 语言在编译的过程中也有符号,

int foo() {}

中的 foo 就是符号,在链接的过程中,链接器会将符号转换为函数地址。各个平台的可执行文件,比如 linux 的 elf,内部都保存着一个符号表,用于动态链接。Windows 的 debugger,会使用一个「符号文件」,保存每个符号在源代码中的信息,比如所在位置。

当加了单引号就是一个常量的概念。这个我没有研究过,但是文档里面似乎暗示这是为了告诉编译器这个保持原封不动。

和编译无关,用解释器也是一样的行为

而且这不是常量,用 C 的方式来说是 static 变量,就是进入函数作用域时不会重新初始化

这样的啊!确实这个有点难理解。谢谢!这样说我就明白了。