2013-08-19 5 views
5

Многие LISP имели FEXPR, но они не были включены в CL.
Я читал, что это связано с тем, что FEXRP не работают со статическим анализом.
Может кто-нибудь объяснить это?Почему FEXPR отказались от Common Lisp?

+1

Лично я бы предпочел, если вы разместите вопросы о реальных проблемах программирования в Stackoverflow. Плюс ваш вопрос неправильный: «статистический анализ» - что это? Также Common Lisp не отказался от FEXPR. Они были вне моды до того, как существовали CL. –

ответ

2

Из Wikipedia article on FEXPRs:

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

+0

Да, я читал это, но на самом деле он не объясняет все причины этого. Или это была единственная причина? – lonjil

+0

Я ничего не знаю о fexprs, кроме того, что я читал здесь, @lonji, но для меня это кажется достаточно хорошей причиной. Насколько я понимаю, Питман говорит, что включение fexprs будет иметь эффект замедления кода, который использует lambdas во время выполнения, потому что компилятор не сможет оптимизировать этот код. – Mars

1

FEXPR больше похожи на DEFUN, а не DEFMACRO, поскольку они становятся объектами первого класса. Это представляется сложным для компилятора, поскольку он не может знать, что-то является функцией или макросом во время компиляции, оставляя, возможно, некоторые макросы, которые не были расширены во время компиляции. Вы можете read the paper here with comments.

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

Paul Grahams Arc has anonymous macros и kernel has them too, поэтому он не полностью ушел, но я чувствую, что это было просто для удобства. Попробуйте map, и вы увидите, насколько это не полезно.

+1

fexprs не являются анонимными макросами. Ваше объяснение неверно несколькими способами. –

+0

Лучшим способом объяснить их было бы то, что они являются макросами времени выполнения. – Zaz

+0

Да, но вы бы попытались расширить их там, где сможете. Проблема в том, что вы не расширяете функции, и если вы можете передать fexpr в качестве аргумента, вам нужно иногда их расширять во время выполнения. – Sylwester