这是 Paul Graham 的 On Lisp 一书中的简化示例(类似于语法的方案)。
(define-macro (bar)
(let ((x 10) (y '(1 2 3)) (z 'foo))
`(list ,x `(,',z ,,@y))))
我知道,,@y
应该如何工作,但不确定,',z
应该如何工作,首先应该评估什么以及以什么顺序。(我知道它应该评估为符号 foo 因为它(10 (foo 1 2 3))
以诡计返回,但我不确定确切的步骤是什么)。
我在 JavaScript 中的 lisp 中需要这个,我得到了结果:
(10 ((unquote z) 1 2 3))
因为它只是从左到右评估它(我只处理特殊,,
和更多的逗号)。你应该如何评估这个表达式。
书中也有这样的例子:
(defmacro propmacro (propname)
`(defmacro ,propname (obj)
`(get ,obj ',',propname)))
应该如何',',
评价?这种情况下的步骤是什么?
是否还有其他带有反引号/准引号的奇怪边缘情况?您能否展示这些示例以及应如何评估它们以及以什么顺序进行评估?