Инструменты пользователя

Инструменты сайта


examination:flp:question21

Вычисление лямбда-вызова, или лямбда-преобразование

Вычисление лямбда-вызова, или применение лямбда- выражения к фактическим параметрам, производится в два этапа. Сначала вычисляются значения фактических параметров и соответствующие формальные параметры связываются с полученными значениями. Этот этап называется связыванием параметров (spreading). На следующем этапе с учетом новых связей вычисляется форма, являющаяся телом лямбда-выражения, и полученное значение возвращается в качестве значения лямбда-вызова. Формальным параметрам после окончания вычисления возвращаются те связи, которые у них, возможно, были перед вычислением лямбда- вызова. Весь этот процесс называют лямбда-преобразованием (lambda conversion).

Объединение лямбда-вызовов

Лямбда-вызовы можно свободно объединять между собой и другими формами. Вложенные лямбда-вызовы можно ставить как на место тела лямбда-выражения, так и на место фактических параметров. Например, в следующем вызове тело лямбда-выражения содержит вложенный лямбда-вызов:

_((lambda (у)            ; у лямбда-вызова 
((lanbda (x)             ; тело вновь 
(list у x))              ; лямбда-вызов 
'ВНУТРЕННИЙ)) 
'ВНЕШНИЕ) 
> (ВНЕШНИЕ ВНУТРЕННИЙ) 


В приведенном ниже примере лямбда-вызов является аргументом другого вызова:

_((lambda (x)       ;лямбда-вызов
(list 'ВТОРОЙ x))   ;у которого аргументом является новый лямбда-вызов 
((lambda (у)  
(list у))  
'ПЕРВЫЙ)) 
> (ВТОРОЙ (ПЕРВЫЙ)) 


Обратите внимание, что лямбда-выражение без аргументов (фактических параметров) представляет собой лишь определение, но не форму, которую можно вычислить. Само по себе оно интерпретатором не воспринимается:

_(lambda (х у) (cons х (cons у nil))) 
> Error: Undefined function LAMBDA  
examination/flp/question21.txt · Последние изменения: 2014/01/15 08:17 (внешнее изменение)