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