有关 quote 和 quosiquote

By guenchi at 2018-02-06 • 0人收藏 • 180人看过

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


登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...