Page 36

ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО аргументом

лямбда-функции,

но

все

же

попадает внутрь нее и используется в ней (захватывается переменная

из

контекста).

называется

Такая

свободной

переменной для лямбда-функции. А лямбдафункции,

которые

переменные,

содержат

называются

свободные

замыканиями.

Казалось бы, ничего особенного. И зачем только придумывать новые термины?

Давайте рассмотрим другой пример (взят из Википедии):

(display ((adder 7) 4))

очередь,

где мы adder вызвали. То есть получается, что значение b внутри лямбда-функции замкнуто на внешнее (по отношению к этой функции) значение

фактического

параметра

(да,

думаю написать это по-человечески).

я

Кэрринг (карринг, currying) При объявлении функции перечисляем список

Важно понять, что при каждом вызове adder, он создает и возвращает новый экземпляр

лябмда-функции. Вызывая adder 10 раз с разными параметрами b, мы получим в итоге

десять разных функций. Каждая из них будет

функцией одного аргумента. И каждая будет сумму

своего

остановимся. Осмыслим.

С

аргумента

каким?

будет

к

бы,

это

с

; и x и y - формальные параметры данной функции ) )

Стало: (define (func x) (lambda (y)

Опять

( ; здесь то же самое выражение, содержащее x и y ; но теперь y - это формальный параметр этой ; внутренней лямбда-функции,

своему

наверное, и проявляется основное значение Казалось

как

; здесь выражение, содержащее x и y

; а x - свободная переменная

аргументу прибавлять число 7. Вот здесь, «замыкание».

Вот

(

Если мы вызывали adder с числом 7, то функция

переменной.

(define (func x y)

Так. Остановимся, передохнем и осмыслим.

числом.

одной

Было:

; будет напечатано 11

аргумент b и возвращает лямбда-функцию.

слово

свою

adder (оно равно 7) из контекста того места,

делается…

Что делает функция adder? Она принимает

возвращенная

в

связано с фактическим параметром функции

функцию

(+ x b))

некоторым

значение,

многих переменных можно определить через

)

возвращать

Его

ее параметров. На самом деле, функцию от

(define (adder b) (lambda (x)

параметр.

где

в

объявлении нашей лямбда-функции число 7?

) ) )

Его нет, есть только b. Но значение этого b

Другими

лямбда-функцию родили на свет, – внутри

функция

берется из контекста того места, где мы эту вызова функции adder. А b – это формальный

словами,

функция

func

двух

переменных может быть представлена как возвращает

одной

переменной,

лямбда-функцию

которая

одной

36

PROgrammist, №13  

Official editorial layout

PROgrammist, №13  

Official editorial layout

Advertisement