Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
progF_pos.doc
Скачиваний:
36
Добавлен:
11.05.2015
Размер:
1.51 Mб
Скачать

5.6. Ламбда-абстракции в Лиспе

Лисп заимствовал из -исчисления три основных идеи.

  • Для определения функций используются -термы.

  • Основное правило вычисления -редукция.

  • Определения функций являются полноправными данными.

ОтличияЛиспа от-исчисления. Существуют функции, которые при вызове не вычисляют сразу значения своих аргументов (Quote, Cond и т. д.). Благодаря этому можно отличить списки, воспринимаемые как от списков, воспринимаемых как указания к вычислению функций.«Для того чтобы некоторая сугубо логическая концепция могла найти применение в реальном программировании, ее надо основательно «подпортить»».

В Лиспе ламбда-абстракция имеет вид

(lambda (x1 x2 … xn) <body>)

-вызов соответствует вызову функции

(ламбда-выражение a1 a2 … an)

((lambda (x y) (+ (* x x) (* y y))) 6 7)  85

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

Композиция ламбда-вызовов

У ламбда-вызова тело вновь ламбда-вызов

((lambda (y)

( (lambda (x) (list x y)) 0))

1)

 (0 1)

Ламбда-вызов, у которого аргументом является новый ламбда-вызов

((lambda (x) (list 2 x))

((lambda (y) (list y) ) 1))

 ( 2 (1))

Ламбда-выражение - это безымянная функция, которая пропадает тотчас после вычисления значения формы. Ее трудно использовать снова, так как нельзя вызывать по имени, хотя ранее выражение было доступно как списочный объект. Безымянные функции используются как фактические параметры в функциях высших порядков (в чем собственно и состоит сила функционального программирования).

6. Внутреннее представление списков

Как представляются списки и атомы в памяти машины?

Специальные функции, с помощью которых можно изменять внутреннюю структуру списков, в чистом функциональном программировании не используются.

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

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

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

Рис. 1. Списочная ячейка

Каждый известный системе атом записывается в память лишь один раз.

Указатель на список - указывает на первую ячейку списка. Указатель, связанный с символом, указывает на объект, который содержит:

  • значение символа;

  • внешний вид символа (print name);

  • определение функции, для которой данный символ является именем;

  • список так называемых "свойств" символа.

Список представляется в памяти в виде последовательности списочных ячеек, так список (A B C) состоит из трех ячеек (рис. 2).

Рис. 2. Список (A B C) в памяти

При выполнении (setqсписок '(A B C)) побочный эффект вычисления функции setq заключается в замещении указателя в поле значения символа (в данном случае символа список) (рис. 3).

Рис. 3. Значение символа

Функции first и rest возвращают значения указателей CAR и CDR. Функция cons создает ячейку и возвращает на нее указатель. Так, например, результат вычисления выражения

(cons голова хвост)

список ((B C) A B C) представлен на рис. 4.

Рис. 4. Функция cons

Функция cons не меняет структуры списков и значения переменных голова и хвост. Логически идентичные атомы хранятся в системе один раз.

У списков могут быть общие части (рис. 5).

Рис. 5. Список (1 2 1 3)

Логически идентичные списки могут быть представлены различными списочными ячейками. В качестве примера, результат вызова (setq список1 '(( b c) a b c)) имеет следующее представление в памяти (рис. 6).

Рис. 6. Представление значения символа список1

Но логически эквивалентный список можно создать и по-другому:

(setq bc '(b c))

(setq abc (cons 'a bc))

(setq список2 (cons bc abc))

На рис. 7 показаны последовательные изменения списочных ячеек в памяти.

Логическая структура списка всегда имеет вид бинарного дерева. Физическая структура может быть ациклическим графом (ветви могут сходиться).

Рис.7. Представление значения символа список2

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