我在看 Quote 使用的例子,其中'(quote foo) ⇒ 'foo
可是 quote 为啥变成引号了?同样 '(print "hello") ⇒ (print "hello")
是quote 有什么特殊吗,quote 的意思我是能理解,请求 quote 这个函数有什么特殊吗?
quote
即 '
,所以 '(quote foo)
等同于 ''foo
,求值之后消掉一个 quote,所以结果是 'foo
。
意思就是它就是一种语法。不是一个函数?
'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,"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
变量,就是进入函数作用域时不会重新初始化
这样的啊!确实这个有点难理解。谢谢!这样说我就明白了。