Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Fp_3.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
635.39 Кб
Скачать

3.5.1 Lambda – функция в Racket

Эта функция реализуется следующим стандартным выражением

(lambda (x1…xn) expr)

она возвращает функцию, вычисляющую значение выражения expr при подстановке фактических параметров вместо x1…xn.

Функция, определенная с помощью лямбда-выражения, ничем не отличается от функции созданной посредством define, за исключением того, что она не имеет имени.

Фактически - (define (f x1xn)  expr)

полностью эквивалентно - (define  (lambda (x1xn) expr) ).

Например, sqr можно было бы определить и так

(define sqr (lambda (x) (* x x)))

Получается, что название переменной, связанное с –выражением означает функцию!

Лямбда-выражение может использоваться всюду, где используется имя функции, например как оператор в комбинации вида. Конкретное значение для списка параметров списка, задается после  выражения.

Примеры. Запишем для интерпретации на LISPе выражение (y.(y + 1)) 2

> ((lambda (y) (+ y 1)) 2) 3

Теперь посмотрим на запись примера 2: (x. ( f.f(f x) ) (y.(y + 1)) ) 2

> ((lambda (x) ((lambda (f) (f (f x))) (lambda (y) (+ y 1)) )) 2)

4

Заметим, что интерпретация выражения происходит сразу же, надо только правильно вписать в выражение конкретное значение для связывания.

3.5.2 Функция let и локальное -связывание

Чтобы упростить запись выражений, некоторым его частям можно присвоить локальные имена с помощью связывающий формы let.

(let ((x1 expr1)(x2 expr2) … (xn exprn)) expr)

Его действие таково.

  1. Сначала каждое xi заменяется значением выражения expri.

  2. Эти значения подставляются в expr

  3. Значением всей формы будет значение выражения expr.

Этой формы записи нет в стандартном LISPе, но она полезна и может быть использована при решении лабораторных работ.

Например, функция для вычисления площади треугольника по формуле Герона, а именно: , где без -функции запишется так

>(define (square-triangle1 a b c)

(let ((p (/ (+ a b c) 2)) )

(sqrt (* p (- p a) (- p b) (- p c))) ))

Тело функции получает выражение подобное такому:

(let (p exprp) expr)

Теперь проверим его работу

> (square-triangle1 5 4 3)

6

Здесь сначала вычисляется значение полупериметра, затем внутренний параметр p связывается с этим полупериметром, что и подставляется в подкоренное выражение.

Заметим, что sqrt – функция встроенная.

Того же эффекта можно было бы добиться применяя лямбда-выражение, но надо предвидеть, их здесь два: для внутреннего параметра p оно своё.

>(define square-triangle2 (lambda (a b c)

(lambda (p) (sqrt (* p (- p a) (- p b) (- p c) )))

(/ (+ a b c) 2) ) )

> (square-triangle2 5 4 3)

6

Результат получается одинаковым, но запись с let как-то привычнее.

Page 16 of 16

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]