Fluid Binding in Chez Scheme

Fluid Binding是Chez另一个扩展,这个名词不太好翻译,我想想暂时就叫易变绑定吧,如果有更好的翻译请在文后的评论中尽情发表。

先看看该语法描述: (fluid-let ((var expr) …) body1 body2 …) returns: the values of the body body1 body2 … libraries: (chezscheme)

该Binding的作用类似局部变量,与set! 比较相似。由fluid-let定义的变量必须已绑定到顶层(top level)或者封闭的lambda内或者其他形式的绑定,这很关键!


请看代码:

(let ([x 3])
  (+ (fluid-let ([x 5]) x)
	x))  8

先定义变量x=3,然后在加法操作当中临时将x的值改为5,最后结果为8,如果将fluid-let中的x换个名字,比如y,将如何呢? 会得到一个异常:

Exception: variable y is not bound

y没有绑定,是的,y即没有在顶层中被定义,也未在某个lambda中或者任何其他形式,这里只能是x


再学习下两个例子,加深印象:

(let ([x 'a])
  (letrec ([f (lambda (y) (cons x y))])
	(fluid-let ([x 'b]) (f 'c))
))  (b . c)
(let ([x 'a])
  (call/cc
    (lambda (k)
       (fluid-let ([x 'b])
       (letrec ([f (lambda (y) (k '*))])
           (f '*)))))
x)  a

Fluid Binding实际上是Scheme对Dynamic Scoping的保留,Scheme使用的是Lexical Scoping, 对于这两种Scoping更详细的描述可参考Lexical Scoping and Dynamic Scoping