Новосибирский Государственный Университет
Опубликован: 05.02.2007 | Доступ: свободный | Студентов: 2223 / 413 | Оценка: 4.30 / 4.23 | Длительность: 10:15:00
Лекция 6:

Интерпретатор

< Лекция 5 || Лекция 6: 12 || Лекция 7 >

Упражнение 6.1: Это определение можно немного уточнить, если а-список при связывании названий функций пополнять не в начале, а в конце.

assoc и pairlis уже определены ранее.

(DEFUN evcon (c a) (COND 
     ((ev (caar  c) a) (ev (cadar c) a) )
   ( T  (evcon (cdr c) a)     ) ))

*) Примечание. В идеальном Лиспе не допускается отсутствие истинного предиката, т.е. пустого C.

(DEFUN evlis (m a) (COND
    ((null m) Nil )
    ( T          (cons(ev (car m) a) 
     (evlis(cdr m) a)    ))   )

При

(DEFUN eval (e)  (ev e ObList ))

определения функций могут накапливаться в системной переменной ObList, тогда они могут работать как глобальные определения. ObList обязательно должна содержать глобальное определение встроенной константы Nil, можно разместить в ней и представление истины - T.

Определение универсальной функции является важным шагом, показывающим одновременно и механизмы реализации языков программирования, и технику функционального программирования на любом языке. Пока еще не описаны многие другие особенности языка Лисп, которые будут рассмотрены позднее. Но все они будут увязаны в единую картину, основа которой согласуется с этим определением.

  1. В строгой теории идеального Лиспа все функции следует определять всякий раз, как они используются. На практике это неудобно. Реальные системы имеют большой запас встроенных функций (более тысячи в Clisp-е), известных языку, и возможность присоединения такого количества новых функций, какое понадобится.
  2. В идеальном языке Лисп базисные функции CAR и CDR не определены для атомарных аргументов. Такие функции, имеющие осмысленный результат не на всех значениях естественной области определения, называют частичными. Отладка и применение частичных функций требует большего контроля, чем работа с тотальными, всюду определенными функциями.

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

  3. Для расширений и диалектов языка Лисп характерно большое разнообразие условных форм, конструкций выбора, ветвлений и циклов, практически без ограничений на их комбинирование. Форма COND выбрана для начального знакомства как наиболее общая. За редким исключением в Лисп-системе нет необходимости писать в условных выражениях (QUOTE T) или (QUOTE NIL). Вместо них используются встроенные константы T и Nil соответственно.
  4. В реальных системах функционального программирования обычно поддерживается работа с целыми, дробными и вещественными числами в предельно широком диапазоне, а также работа с кодами и строками. Такие данные, как и атомы, являются минимальными объектами при организации обработки информации, но отличаются от атомов тем, что их смысл задан их собственным представлением непосредственно. Их понимание не требует ассоциаций или связывания. Поэтому и константы такого вида не требуют префикса в виде апострофа.

Предикаты и истинность в Лиспе

В Лиспе есть два атомных символа, которые представляют истину и ложь соответственно. Эти два атома - T и NIL. Эти символы - реальные значения всех предикатов в системе. Главная причина в удобстве кодирования. Во многих случаях достаточно отличать произвольное значение от пустого списка.

Не существует формального различия между функцией и предикатом в Лиспе. Предикат может быть определен как функция со значениями либо T либо NIL. Можно использовать форму, не являющуюся предикатом там, где требуется предикат: предикатная позиция условного выражения или аргумент логического предиката. Семантически любое S-выражение, только не NIL, будет рассматриватсья как истинное в таком случае. Предикат EQ ведет себя следующим образом:

  1. Если его аргументы различны, значением EQ является NIL.
  2. Если оба его аргументы являются одним и тем же атомом, то значение - Т.
  3. Если значения одинаковы, но не атомы, то его значение T или NIL в зависимости от того, идентично ли представление аргументов в памяти.
  4. Значение EQ всегда T или NIL. Оно никогда не бывает неопределено, даже если аргументы плохие.

Выполнено достаточно строгое построение совершенно формальной математической системы, называемой "Элементарный ЛИСП". Составляющие этой формальной системы:

  1. Множество символов, называемых S-выражениями.
  2. Система функциональных обозначений для основных понятий, требуемых при программировании обработки S-выражений.
  3. Формальное представление функциональных обозначений в виде S-выражений.
  4. Универсальная функция (записанная в виде S-выражения), интерпретирующая обращение произвольной функции, записанной как S-выражение, к ее аргументам.
  5. Система базовых функций, обеспечивающих техническую поддержку обработки S-выражений, и специальных функций, обеспечивающих управление вычислениями.

Выполненное определение универсальной функции – макетный образец Лисп-системы, основные черты которой унаследованы многими системами программирования.

Таблица 6.1. Clisp: Функции для обработки программ
(Apply Функция Список-аргументов ) Применяет функцию к списку аргументов
( Compile Название ) Компилирует названную функцию, кроме того сообщает, успешна ли компиляция
(Eval Форма ) Вычисление формы
(Funcall Функция Аргумент … ) Применяет функцию к аргументам
(The Тип Форма) Проверяет имеет ли аргумент указанный Тип
(Type-of Данное ) Выдает тип данного
(Quote Форма ) Форма без вычисления выдается как результат

Выводы:

  • Универсальная функция – это функция, которая может вычислять значение любой формы и представляет собой инетрпретатор в миниатюре.
  • При реализации универсальной функции необходимо учитывать способ представления контекста и виды вычисляемых форм.
  • Контекст удобно представлять с помощью ассоциативных списков.
  • Универсальная функция должна предусматривать основные виды вычисляемых форм, задающих значения аргументов, а также представления функций, в соответствии со сводом вышеприведенных правил языка.
< Лекция 5 || Лекция 6: 12 || Лекция 7 >