我正在学习 Clojure,并试图通过与 Python 的类似功能进行比较来理解 reader、quoting、eval 和 homoiconicity。
在 Python 中,避免(或推迟)评估的一种方法是将表达式括在引号之间,例如。'3 + 4'
. 您可以稍后使用 来评估它eval
,例如。eval('3 + 4')
屈服7
。(如果您只需要引用 Python 值,您可以使用repr
函数而不是手动添加引号。)
在 Lisp 中,您使用quote
or'
来引用和eval
评估,例如。(eval '(+ 3 4))
屈服7
。
因此,在 Python 中,“引用”的内容由字符串表示,而在 Lisp 中,它由具有quote
第一项的列表表示。
最后,我的问题是:为什么 Clojure 允许(eval 3)
虽然3
没有被引用?仅仅是 Lisp 风格的问题(尽可能给出答案而不是错误)还是背后有其他原因?这种行为对 Lisp 来说是否必不可少?