Многие LISP имели FEXPR, но они не были включены в CL.
Я читал, что это связано с тем, что FEXRP не работают со статическим анализом.
Может кто-нибудь объяснить это?Почему FEXPR отказались от Common Lisp?
ответ
Из Wikipedia article on FEXPRs:
В 1980 конференции по Лисп и функциональное программирование, Kent Pitman представил документ «специальные формы в Лиспе», в котором он обсуждал преимущества и недостатки макросов и fexprs, и в конечном счете осужденных fexprs. Его центральное возражение заключалось в том, что на диалекте Лиспа , который позволяет fexprs, статический анализ не может вообще определить, является ли оператор оператором обычной функцией или fexpr, поэтому статический анализ не может определить, будут ли оцениваться операнды . В частности, компилятор не может определить, можно ли безопасно оптимизировать подвыражение , поскольку подвыражение может быть рассматриваться как неоцененные данные во время выполнения.
Да, я читал это, но на самом деле он не объясняет все причины этого. Или это была единственная причина? – lonjil
Я ничего не знаю о fexprs, кроме того, что я читал здесь, @lonji, но для меня это кажется достаточно хорошей причиной. Насколько я понимаю, Питман говорит, что включение fexprs будет иметь эффект замедления кода, который использует lambdas во время выполнения, потому что компилятор не сможет оптимизировать этот код. – Mars
Kent Pitman called для отказа от fexpr, потому что это невозможно было скомпилировать.
Для углубленного обсуждения fexpr см. Докторскую диссертацию Джона Н. Шутта Fexprs as the basis of Lisp function application or $vau : the ultimate abstraction.
FEXPR
больше похожи на DEFUN
, а не DEFMACRO
, поскольку они становятся объектами первого класса. Это представляется сложным для компилятора, поскольку он не может знать, что-то является функцией или макросом во время компиляции, оставляя, возможно, некоторые макросы, которые не были расширены во время компиляции. Вы можете read the paper here with comments.
После прочтения я не уверен, что его выводы по-прежнему верны, поскольку наши компиляторы лучше выполняют расширенную постоянную складку и другие оптимизации. Во всяком случае, макросы более высокого порядка не так полезны, как функции более высокого порядка, поэтому мы не будем их очень скучать.
Paul Grahams Arc has anonymous macros и kernel has them too, поэтому он не полностью ушел, но я чувствую, что это было просто для удобства. Попробуйте map
, и вы увидите, насколько это не полезно.
fexprs не являются анонимными макросами. Ваше объяснение неверно несколькими способами. –
Лучшим способом объяснить их было бы то, что они являются макросами времени выполнения. – Zaz
Да, но вы бы попытались расширить их там, где сможете. Проблема в том, что вы не расширяете функции, и если вы можете передать fexpr в качестве аргумента, вам нужно иногда их расширять во время выполнения. – Sylwester
- 1. + Vector Common Lisp
- 2. Замены в Common Lisp
- 3. Цитата из Common Lisp
- 4. Common Lisp Unbound Variable
- 5. Common Lisp: asdf зависит от конкретной версии
- 6. Clojure: эквивалент «do» от Common Lisp
- 7. Почему двоеточие предшествует переменным в Common Lisp
- 8. Common Lisp: Почему progn - специальная форма?
- 9. Почему # 'используется перед лямбдой в Common Lisp?
- 10. Webdevelopment in Common Lisp
- 11. Common Lisp Weak References?
- 12. common lisp и emacs
- 13. Scheme vs Common Lisp
- 14. Common Lisp Упражнения/Проблемы
- 15. Ассоциация в Common Lisp
- 16. Common Lisp SublimeREPL
- 17. Common Lisp Timer
- 18. Matrix Transpose Common Lisp
- 19. Common Lisp Эквивалент `man`
- 20. Common Lisp Параллельное программирование
- 21. Потоки в Common Lisp?
- 22. Common Lisp: создание каталога
- 23. Реализация Common Lisp `format`
- 24. Weird синтаксис Common Lisp
- 25. Сортировка полиномов Common Lisp
- 26. Common lisp gray streams
- 27. Циркуляр в Common Lisp
- 28. Common Lisp рекурсивных макроподстановок
- 29. Common Lisp: как отобразить точку?
- 30. Common Lisp: cons in loop
Лично я бы предпочел, если вы разместите вопросы о реальных проблемах программирования в Stackoverflow. Плюс ваш вопрос неправильный: «статистический анализ» - что это? Также Common Lisp не отказался от FEXPR. Они были вне моды до того, как существовали CL. –