词法作用域
Racket是一个词汇范围的语言,这意味着无论何时一个标识符被用作一个表达,表达的文本环境中的某些东西决定了标识符的绑定。这个规则适用于lambda主体中的标识符以及其他任何地方。
在下面的rgb-series函数中,每个lambda形式中使用的mk都是指rgb-series的参数,因为它是在文本范围内的绑定:
(define (rgb-series mk)
(vc-append
(series (lambda (sz) (colorize (mk sz) "red")))
(series (lambda (sz) (colorize (mk sz) "green")))
(series (lambda (sz) (colorize (mk sz) "blue")))))
> (rgb-series circle)
image
> (rgb-series square)
image
下面是另一个示例,rgb-maker接受一个函数并返回一个新的函数,这个函数将记住并使用原始函数。
(define (rgb-maker mk)
(lambda (sz)
(vc-append (colorize (mk sz) "red")
(colorize (mk sz) "green")
(colorize (mk sz) "blue"))))
> (series (rgb-maker circle))
image
> (series (rgb-maker square))
image
请注意,与使用rgb-series相比,通过rgb-maker组合函数如何在图片中创建不同的对象对齐方式。