词汇范围如何影响lambda函数?

时间:2018-04-28 02:47:31

标签: racket

这是Racket教程的一个例子。

(define (square n)
  (filled-rectangle n n))

(define series
  (lambda (mk)
    (hc-append 4 (mk 5)(mk 10)(mk 20))))

(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")))))

(define (rgb-maker mk)
  (lambda (sz)
    (vc-append (colorize (mk sz) "red")
               (colorize (mk sz) "green")
               (colorize (mk sz) "blue"))))

我认为功能rgb-series和rgb-maker正在做同样的事情。但是,他们的输出完全不同。

enter image description here

我无法弄清楚原因。任何人都可以解释两个功能之间的区别吗?谢谢

1 个答案:

答案 0 :(得分:2)

区别在于vc-appendhc-append的应用方式。

当您使用hc-append创建一行图片时,这些图片会被安排在[h] orizo​​ntally,[c]对齐。例如:

enter image description here

现在,您可以使用vc-append将三个这样的行堆叠到一列中,形成以下最终图:

enter image description here

这是rgb-series中发生的事情,首先创建行,然后将然后堆叠到列中。

另一方面,(series (rgb-maker circle))首先创建一列圆圈,然后将这些列排列成一行,如下所示:

enter image description here