此問題已重新插入到this和this for Elisp。基本上,如何閱讀和評估反向報價?什麼過程正在發生?標準是否對此有任何說明?通用Lisp中的反引號:閱讀並評估
以下是我所期望的,但它不會發生:符號`是讀者宏觀和被翻譯成某種(BACKQUOTE ...)
宏/特殊形式(類似於'
被翻譯成(QUOTE ...)
)。這不會發生,事實上,Common Lisp甚至沒有一個BACKQUOTE
宏。
發生了什麼(SBCL):
CL-USER> (defparameter *q* (read-from-string "`(a b ,c)"))
*Q*
CL-USER> *q*
`(A B ,C)
CL-USER> (car *q*)
SB-INT:QUASIQUOTE
CL-USER> (cdr *q*)
((A B ,C))
東西與預期不同,但確定。現在,,C
是對自己的一個有趣的東西:
CL-USER> (type-of (third (cadr *q*)))
SB-IMPL::COMMA
如果沒有逗號符號,計算讀取表現優良:
CL-USER> (eval (read-from-string "`(a b c)"))
(A B C)
但是,如果我想即使評價原始表達式當地爲C
結合,有一個問題:
(let ((c 10)) (eval (read-from-string "`(a b ,c)")))
; in: LET ((C 10))
; (LET ((C 10))
; (EVAL (READ-FROM-STRING "`(a b ,c)")))
;
; caught STYLE-WARNING:
; The variable C is defined but never used.
;
; compilation unit finished
; caught 1 STYLE-WARNING condition
; Evaluation aborted on #<UNBOUND-VARIABLE C {1007A3B2F3}>.
這意味着EVAL
沒有拿起環境中,C
被綁定。
PS。有趣的是,在Elisp中這是有效的。
@RainerJoswig是「標準的宏觀人物」和「讀者宏觀」是一回事還是我對他們感到困惑? – mobiuseng
'標準宏字符'表示字符是由標準定義的宏字符。 CLHS詞彙表:宏觀人物n。 Lisp閱讀器在其主要調度循環中遇到的字符引入閱讀器宏。 –
有關技術細節,您還可以查看您的實現如何操作quasiquotes,就像[Faréquasiquotes](https://gitlab.common-lisp.net/frideau/fare-quasiquote)一樣。 – coredump