Как лексический охват влияет на лямбда-функцию? - PullRequest
0 голосов
/ 28 апреля 2018

Это пример учебника по Ракеткам.

(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 голосов
/ 28 апреля 2018

Разница заключается в том, как применяются vc-append и hc-append.

Когда вы создаете ряд пиктов, используя hc-append, эти пикты располагаются [h] или горизонтально, [c] entre выровнены. Например:

enter image description here

Теперь вы можете сложить три такие строки в столбец, используя vc-append, образуя следующий окончательный пикт:

enter image description here

Это то, что происходит в rgb-series, когда сначала создаются строки, , а затем укладываются в столбец.

С другой стороны, (series (rgb-maker circle)) сначала создает столбец из кружков, , а затем размещает эти столбцы в ряд, который будет выглядеть следующим образом:

enter image description here

...