quote 和 quosiquote 不但有语法上的区别,而且有运行上的区别。
quote 是在编译时执行的,而 quosiquote 是在运行时执行的。也就 是说你的输入一旦被解释器读到,quote 的内容就已经被创建了。所 以,
(define (f) '(a b c)) (eq? (f) (f))
会返回 #t.
而
(define (bogus-function x) (let ((result '(nil nil))) ;Static list which is filled in each time (set-car! (cdr result) x) ; the function is called result)) (define x (bogus-function 'foo)) (define y (bogus-function 'bar))
之后,x 的值是 '(nil bar). 这是因为 quote 在 bogus-function 被定义时就已经定义了。反复运行 bogus-function 并不会返回不同 的结构。
比较一下下面这个例子:
(define (f) `(a b c)) (eq? (f) (f))
结果是 #f. 说明 两次对 f 的调用返回了不同的 (a b c). 说明 quosiquote 是在运行时执行的。