Syntactic Extension and Modules in Chez Scheme

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