Fluid Keyword Bindings
fluid-let-syntax
语法: fluid-let-syntax ((keyword expr) …) form1 form2 …) fluid-let-syntax与标准let语法相似,不同之处在于Fluid-let-syntax在其body扩展期间会暂时更改keyword的现有绑定,而不是引入keyword的新绑定。也就是说,在扩展form1 form2 …的过程中,每个keyword的可见范围(或顶级)将会临时替换为新的绑定关系。
(let ([f (lambda (x) (+ x 1))])
(let-syntax
([g (syntax-rules () [(_ x) (f x)])])
(let-syntax ([f (syntax-rules () [(_ x) x])])
(g 1) => 2
)
)
)
(let ([f (lambda (x) (+ x 1))])
(let-syntax
([g (syntax-rules () [(_ x) (f x)])])
(fluid-let-syntax ([f (syntax-rules () [(_ x) x])])
(g 1) => 1
)
)
)
对比上述两段代码,可知:两个表达式基本相同的,除了前者采用内部let-synctax语法,第二个采用fluid-let-syntax语法。在第一个表达式中,(g 1)扩展中的出现的f引用的是let-bound的变量f,而第二个表达式,f引用的是由fluid-let-syntax绑定的f