Quote Quasiquote

区别

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 是在运行时执行的。