Введение в программирование на Лиспе



             

Именование значений и подвыражений - часть 3


Напротив, этот резерв указывает на потенциал подхода, который мы не научились использовать лучшим образом.

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

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

Обычно EVAL вычисляет аргументы функций до применения к ним функций с помощью APPLY. Таким образом, если EVAL задано (CONS X Y), то сначала вычисляются X и Y, а потом работает CONS над полученными значениями. Но если EVAL задано (QOUTE X), то X не будет вычисляться. QUOTE - специальная форма, которая препятствует вычислению своих аргументов.

Специальная форма отличается от других функций двумя чертами. Ее аргументы не вычисляются до того, как специальная форма сама просмотрит свои аргументы. COND, например, имеет свой особый способ вычисления аргументов с использованием EVCON. Второе отличие от функций заключается в том, что специальные формы могут иметь неограниченное число аргументов.

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

Специальная функция FUNCTION обеспечивает доступ к функциональному объекту, а функция FUNCALL обеспечивает применение функции к произвольному числу ее аргументов.

(funcall f a1 a2 ... ) = (apply f (list a1 a2 ...))

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




Содержание  Назад  Вперед