許多LISPs都有FEXPRs,但它們不包含在CL中。
我讀到這是因爲FEXRP在靜態分析中效果不好。
有人可以解釋這一點嗎?爲什麼FEXPR在Common Lisp中被放棄?
5
A
回答
2
在對Lisp和函數式編程的1980年會議,肯特·皮特曼 提交的論文「在Lisp的特殊形式的」中,他討論了宏和fexprs的 優點和缺點,並最終致命fexprs 。他的中心反對意見是,在允許fexprs的Lisp方言 中,靜態分析不能確定運算符是代表普通函數還是fexpr - 因此,靜態分析不能確定操作數是否將被 評估。尤其是,編譯器無法確定是否可以安全地優化子表達式,因爲子表達式可能在運行時將其視爲未評估的數據。
3
肯特皮特曼called放棄fexpr,因爲它似乎是不可能編譯它。
有關fexpr的深入討論,請參閱John N. Shutt的博士論文 Fexprs as the basis of Lisp function application or $vau : the ultimate abstraction。
1
FEXPR
更像DEFUN
而不是DEFMACRO
,因爲它們成爲頭等對象。這對於編譯器來說似乎很困難,因爲在編譯時它不知道某個函數或宏是否是某個函數或宏,因此在編譯時可能會有一些宏未擴展。你可以read the paper here with comments。
在閱讀之後,我不確定他的結論是否仍然屬實,因爲我們的編譯器在進行高級常量摺疊和其他優化時更好。無論如何,更高階的宏不像高階函數那樣有用,所以我們不會錯過它們。
Paul Grahams Arc has anonymous macros and kernel has them too所以它並沒有完全消失,但我覺得這只是爲了方便。試試map
,你會發現它不是很有用。
相關問題
- 1. 爲什麼Common Table Expression被稱爲「Common」?
- 2. Common Lisp:什麼是#+零?
- 3. 爲什麼Fabric存儲庫被放棄?
- 4. 什麼| 5E |在Common Lisp中是什麼意思?
- 5. 在Common Lisp中,爲什麼宏使用gensym,但不是AND?
- 6. Common Lisp中
- 7. 與Common Lisp中
- 8. In Common Lisp什麼是印刷表示?
- 9. Common Lisp可以做些什麼?
- 10. #+:和#的含義是什麼#::in common lisp
- 11. Common Lisp a Lisp-n?
- 12. 爲什麼冒號在Common Lisp的變量之前
- 13. 爲什麼#在Common Lisp的lambda之前使用?
- 14. 爲什麼QuickCheck放棄?
- 15. Common Lisp爲什麼(列表+ 1 2)評估爲('(+ 1 2)1 2)
- 16. 關於Common Lisp中
- 17. 規則Common Lisp中
- 18. 如果Common Lisp中
- 19. 的#ifndef Common Lisp中
- 20. 如何Common Lisp中
- 21. 替換Common Lisp中
- 22. (撰寫)在Common Lisp
- 23. 在Common Lisp中編寫++宏
- 24. Emacs Lisp和Common Lisp之間的主要區別是什麼?
- 25. Common Lisp流?
- 26. Step Eval Common Lisp
- 27. 「unfold」for common lisp?
- 28. Predicates Common Lisp
- 29. Common Lisp SublimeREPL
- 30. Common Lisp Binary Tree
就我個人而言,如果您在Stackoverflow上發佈有關真正編程問題的問題,我更喜歡。另外你的問題是錯的:'統計分析' - 那是什麼? Common Lisp也沒有「放棄」FEXPR。在CL出現之前,它們已經過時了。 –