Fexpr

редактировать

В языках программирования Lisp fexpr является функция, операнды которой передаются ей без оценки. Когда вызывается fexpr, только тело fexpr оценивается; никакие другие оценки не выполняются, кроме случаев, когда они явно инициированы fexpr. Напротив, когда вызывается обычная функция Лиспа, операнды вычисляются автоматически, и только результаты этих вычислений предоставляются функции; и когда вызывается (традиционный) макрос Лиспа, операнды передаются без оценки, но какой бы результат ни возвращала функция макроса, вычисляется автоматически.

Содержание
  • 1 Происхождение названия «fexpr»
  • 2 Пример
  • 3 Обычное использование и устаревание
  • 4 fexprrs с 1980 года
  • 5 См. Также
  • 6 Сноски
  • 7 Ссылки
Происхождение имени "fexpr"

В раннем Лиспе среда отображала каждый символ в список ассоциаций , а не непосредственно в значение. Стандартные ключи для этих списков включали два ключа, используемые для хранения значения данных, которые нужно искать, когда символ появляется в качестве аргумента (APVAL и APVAL1); и четыре клавиши, используемые для сохранения функции, которую нужно искать, когда символ встречается как оператор. Из функциональных клавиш SUBR указывает на скомпилированную обычную функцию, операнды которой были вычислены и переданы ей; FSUBR указал скомпилированную специальную форму, операнды которой были переданы без оценки; EXPR указывает на определяемую пользователем обычную функцию; и FEXPR обозначил определяемую пользователем специальную форму. Единственная разница между FEXPR и EXPR заключалась в том, автоматически ли оценивались операнды.

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

КлючХранитОпределяетсяФункция / Специальная форма
APVALзначение данных---
APVAL1значение данных---
SUBRфункциясистемафункция
FSUBRфункциясистемаспециальная форма
EXPRфункцияпользовательфункция
FEXPRфункцияпользовательспециальная форма
Пример

В качестве простой иллюстрации того, как работают fexprs, вот определение fexpr, записанное в, которое похоже на Схема. (По соглашению в ядре имена fexprs всегда начинаются с $.)

($ define! $ F ($ vau (xyz) e ($ if (>=? (Eval xe) 0) (eval ye) (eval ze))))

Это определение предоставляет fexpr с именем $ f, которое принимает три операнда. Когда вызывается fexpr, создается локальная среда путем расширения статической среды, в которой был определен fexpr. Затем создаются локальные привязки: символы x, y и z привязаны к трем операндам вызова fexpr, а символ e привязан к динамической среде, из которой Вызывается fexpr. Тело fexpr, ($ if...), затем оценивается в этой локальной среде, и результат этой оценки становится результатом вызова fexpr. Чистый эффект состоит в том, что первый операнд оценивается в динамической среде, и, в зависимости от того, является ли результат этой оценки неотрицательным, оценивается либо второй, либо третий операнд, и этот результат возвращается. Другой операнд, третий или второй, не оценивается.

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

Обычное использование и устаревание

Поддержка Fexpr продолжилась в Lisp 1.5, последний стандартный диалект Лиспа до того, как он распался на несколько языков. В 1970-х годах два доминирующих языка Lisp - MacLisp и Interlisp - поддерживали fexprs.

На конференции 1980 года по Лисп и функциональному программированию, Кент Питман представил доклад «Специальные формы в Лиспе», в котором он обсудил преимущества и недостатки макросов и fexpr и в конечном итоге осудил fexpr. Его центральное возражение заключалось в том, что в диалекте Лиспа, допускающем fexprs, статический анализ не может в целом определить, представляет ли оператор обычную функцию или fexpr, поэтому статический анализ не может определить, будут ли вычисляться операнды.. В частности, компилятор не может сказать, можно ли безопасно оптимизировать подвыражение, поскольку подвыражение может обрабатываться как неоцененные данные во время выполнения.

МАКРОСЫ предлагают адекватный механизм для определения определений специальной формы, а... FEXPR - нет.... Предполагается, что при разработке будущих диалектов Лиспа следует серьезно рассмотреть предложение о том, что FEXPR должны быть полностью исключены из языка.

После упадка MacLisp и Interlisp оба Языки Lisp, которые стали доминировать к 1993 г. - Scheme и Common Lisp - не поддерживают fexprs. newLISP поддерживает fexprs, но называет их «макросами». В Picolisp все встроенные функции являются fsubrs, а функции уровня Lisp - это exprs, fexprs, lexprs или их смесь.

fexprs с 1980 года

Начиная с Брайана Смита в 1982 году, было разработано несколько экспериментальных диалектов Лиспа, чтобы исследовать пределы вычислительной рефлексии. Для поддержки отражения эти Лиспы поддерживают процедуры, которые могут реифицировать различные структуры данных, связанные с их вызовом, включая неоцененные операнды вызова, что делает эти процедуры fexprs. К концу 1990-х годов fexprs стал ассоциироваться в основном с вычислительным отражением.

Были получены некоторые теоретические результаты по fexprs. В 1993 году Джон С. Митчелл использовал Lisp с fexprs в качестве примера языка программирования, исходные выражения которого не могут быть формально абстрактными (поскольку конкретный синтаксис исходного выражения всегда может быть извлечен контекстом, в котором он является операндом для fexpr). В 1998 году Митчелл Уанд показал, что добавление устройства fexpr к лямбда-исчислению - устройству, подавляющему перезапись операндов - дает формальную систему с тривиальным уравнением теория, что делает невозможным оптимизацию исходного кода без анализа всей программы. В 2007 году Джон Н. Шатт предложил расширение лямбда-исчисления, которое будет моделировать fexprs без подавления перезаписи операндов, якобы избегая результата Wand.

См. Также

Следующие языки реализовать fexprs или близкие к ним эквиваленты:

Footnotes
Ссылки
Последняя правка сделана 2021-05-20 14:50:03
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте