
- •3. Составные данные.
- •3.1 Списки. Часть I
- •Списком называют любую последовательность допустимых в lisPe элементов, заключенных в круглые скобки.
- •3.1.3 Функция append
- •3.1.4 Функция quote.
- •3.1.5 Функция eval
- •3.2 Точечные пары
- •3.3 Списки. Часть II
- •3.4 Две функции работы со списками
- •Лямбда-выражения и связывающие формы.
- •Для строгости определения приведем бнф для нотации
- •Примеры правильных - выражений:
- •Здесь X связывается с 3, а y остаётся свободной
- •Здесь z связывается с 5, остальные переменные оказываются свободными
- •3.5.1 Lambda – функция в Racket
- •3.5.2 Функция let и локальное -связывание
3.5.1 Lambda – функция в Racket
Эта функция реализуется следующим стандартным выражением
(lambda (x1…xn) expr)
она возвращает функцию, вычисляющую значение выражения expr при подстановке фактических параметров вместо x1…xn.
Функция, определенная с помощью лямбда-выражения, ничем не отличается от функции созданной посредством define, за исключением того, что она не имеет имени.
Фактически - (define (f x1…xn) expr)
полностью эквивалентно - (define f (lambda (x1…xn) 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)
Его действие таково.
Сначала каждое xi заменяется значением выражения expri.
Эти значения подставляются в expr
Значением всей формы будет значение выражения 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