什麼是動態範圍的語言的一些例子?選擇這種設計的原因是什麼?這是因爲它很容易實現嗎?除了Logo和Emacs Lisp之外,還有其他純動態範圍的語言是什麼?
回答
好吧,有一大堆討論pro和con的網站,所以我不會去那裏。
一個有趣的語言,它具有一些與動態範圍相似的特徵是XSLT;雖然XSLT的模板和變量等在詞彙範圍上,但XSLT當然都是關於XML的 - 而且xml樹中的當前位置是「動態範圍」的,因爲上下文節點是全局的,因此XPath表達式不被評估根據XSLT的詞彙範圍,但根據其動態評估。
Mathematica是另一種通過Block
構造動態確定範圍的語言。使用公式時,這實際上非常有用。它可以讓你寫的東西像
In[1]:= expr = a*t^2 + b*t+ c;
In[2]:= Block[{a = 1, b = -1, c = 2}, Table[expr, {t, 5}]]
Out[2]= {2, 4, 8, 14, 22}
如果像a
和t
變量詞法範圍這不會在所有的工作。它對Mathematica的規則重寫系統非常有效,除此之外,如果它們沒有現有的定義,則會使變量不被評估(作爲符號表達式)。
Mathematica可以僞造Module
構造的詞法作用域,但是這實際上是用新的,據稱是唯一的符號來重寫表達式(如果預測下一個獨特符號將會是什麼,那麼可能會導致衝突,這很容易在多數情況下)。這意味着
Module[{x = 4},
Table[x * t, {t, 5}]]
會變成這樣的事:
Block[{x$134 = 4},
Table[x$134 * t, {t, 5}]
的Emacs Lisp在其圖書館之一,有一個叫做lexical-let
結構(一個真正的Lisp的宏)拉完全相同的伎倆僞造詞彙範圍。
由於您需要動態變量與其當前值之間的某種映射,因此在編譯您的語言時,實際詞彙範圍設置具有性能優勢,而您沒有使用ELisp或Mathematica的假詞彙,做查找(通過散列表或屬性列表或其他)和其他間接層。
編輯:如果你只有詞法變量,你可以通過存儲在進入的範圍和低保舊值在退出範圍恢復了全球性的,詞法變量的原始值假動態作用域。爲了確保這一點,你需要像Lisp的UNWIND-PROTECT
或finally
塊。我已經看到使用C++析構函數完成這些工作,主要是作爲練習。
動態範圍的語言更容易實現。要訪問不在當前活動記錄/堆棧幀中的變量,只需遵循控制鏈接。靜態/詞彙訪問鏈接不需要,使得堆棧幀變小。
動態變量在運行時可能是「不可預知的」,因爲需要知道實際棧幀的順序是要知道將使用哪個變量。通過查看代碼的靜態結構,這些信息不可用。如果程序的實際調用圖在執行時不容易預測,則很容易被人發現。這就是爲什麼今天大多數語言都有靜態範圍界定(然而,大多數異常系統是動態的,因爲這是最實用的)。
但是在某些情況下,動態範圍變量非常有用。例如,當重定向輸出時,可以使用動態變量爲本地代碼設置標準輸出,並從那裏調用所有代碼。
(let ((*standard-output* *some-other-stream*))
(stuff))
在該共口齒不清示例(從塞貝爾),標準輸出被綁定到另一個流的設形式的持續時間,(其包圍的括號內)。當執行離開的時候,它會回到之前的任何事情。請參閱http://gigamonkeys.com/book/variables.html Peter Seibels的免費優秀書籍Practical Common Lisp進行了良好的討論。在Seibels自己的話中:
動態綁定使全局變量更容易管理,但重要的是要注意他們仍然允許在遠處採取行動。綁定一個全局變量有兩個距離效果 - 它可以改變下游代碼的行爲,並且它還可能打開下游代碼將一個新值分配給堆棧上更高的綁定的可能性。只有在需要利用這些特徵中的一個或兩個時,才應使用動態變量。
動態範圍更容易與解釋器一起實現。大多數早期的Lisp解釋器都在使用動態範圍。幾年後,詞法範圍被發現有優勢,但最初主要是在Lisp編譯器中實現的。出現了幾種實現動態範圍的解釋代碼和編譯代碼中的詞法範圍。一些提供了一種特殊的語言結構來提供閉包。像Scheme和Common Lisp這樣的Lisp方言要求解釋和編譯代碼之間沒有區別,因此基於解釋的實現也必須實現詞法範圍。
早期的Smalltalk實現實現了動態範圍。各種Lisp方言實現實現了動態範圍(Interlisp,UCI Lisp,Lisp Machine Lisp,MacLisp,...)。
幾乎所有來自過去20年的新Lisp方言都默認使用詞法作用域,甚至是專門使用。一些出版物詳細描述瞭如何用詞法範圍實現Lisp - 所以沒有理由不使用詞法範圍。
所有shell語言(bash,ksh等)都使用動態作用域。
- 1. 除D之外還有其他語言是否有靜態if?
- 2. EOL == EOS除了BASIC之外還有其他語言嗎?
- 3. 除了編輯emacs之外,emacs LISP的可行性如何?
- 4. 除了Windows上的C/C++之外,其他語言是否還有CScope樣式的源瀏覽器?
- 5. 除了PIVOT之外,還有其他的方法嗎?
- 6. 除了Siphon之外,iPhone還有其他的SIP實現嗎?
- 7. 除了EditorTemplate MVC之外,還有其他htmlAttributes 5.2
- 8. 除了轉義引號之外,還有其他方法嗎?
- 9. 還有其他什麼像WCF,其他平臺,操作系統,語言?
- 10. 除了Erlang之外,還有其他的語言能否將代碼發送到正在運行的實例?
- 11. 除了google和bing之外,還有什麼其他的搜索引擎有python api?
- 12. 除了JavaScript之外,還有其他用於客戶端編程的編程語言嗎?
- 13. 除了BM25,還有什麼其他的排名功能?
- 14. 除了NSZombieEnabled還有什麼其他的調試參數?
- 15. 除了'photo'外,twitter4j還有其他什麼類型的媒體可用
- 16. AMPHP除了nginx之外還有什麼樣的表現impovements
- 17. 除了使用循環之外,是否還有其他方式顯示列表?
- 18. Scheme和Common Lisp之間的實際區別是什麼? (或Lisp的任何其他兩種方言)
- 19. 如何使用Emacs Lisp動態範圍界定?
- 20. 除了可靠性之外,ATCA還有什麼好處?
- 21. 除JavaEE和.NET之外,還有其他語言/平臺的應用服務器框架嗎?
- 22. ASP.NET動態數據爲其他語言
- 23. 簡單的序言程序 - 是一個範圍內還是範圍之外的值?
- 24. 除了英語以外,還有其他哪些語言可以在阿拉伯數字後面添加後綴?
- 25. 除了MSXML以外,還有其他更好的IDOMImplementation嗎?
- 26. 除了MediaPlayer以外,還有其他的Android mp3播放器嗎?
- 27. 除了堆棧之外,還有哪些編程語言在繼續恢復堆?
- 28. 除了處理urlencode結果的編碼之外,還有其他因素嗎?
- 29. 廚師資源的「名稱」除了作爲其他的默認值之外,還有什麼?
- 30. hawq和其他數據庫之間支持的pl語言有什麼不同?
曾幾何時,我知道的所有Lisp版本都具有動態範圍。 elisp是當時最後的倖存者之一。 – 2010-06-15 21:06:20