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