2012-09-09 51 views
1

我已閱讀forthcoming R7RS scheme standard (small language)的當前草稿,但我不明白在何種情況下重新定義頂級綁定並不是錯誤。什麼時候可以覆蓋(R7RS)方案中的頂級綁定?

我想有可能定義設置!第二次在程序頂層引入的綁定。但是從外部庫導入的綁定呢?是否有可能通過標準覆蓋這些綁定?

報告第26/27頁,它說:

程序的頂層也可以包括進口報關手續。 在庫聲明中,使用不同的綁定, 多次導入 相同的標識符或使用define, define-syntax或set!重新定義或變更導入的綁定是錯誤的。但是,REPL應該允許 這些操作。

這是否意味着重新定義只是在導入綁定的庫中發生時發生錯誤?

據我所知,如果編譯器不知道,如果+仍然意味着內置的添加或是任何其他用戶指定的錯誤,則禁止編譯器進行優化。但是從這個角度來看,限制禁止在圖書館級重新綁定是沒有意義的,至少在程序中導入綁定也是有意義的。

P.S .:因爲這完全是關於計劃方案的環境:我是否認爲環境不是一流的公民,因爲人們無法掌握當前的環境? (這又允許編譯的程序忘記綁定的選定名稱)。

回答

4

一般原則是在庫中聲明的綁定只能在同一個庫中移植變異。如果一個庫的綁定被導入到一個程序(或另一個庫)中,那麼它們不能在那裏發生變異。因此,如果一個程序導入(scheme base),則標識符+總是指標準添加例程(除了在本地被lambda, let, let*映射的區域或當然你有什麼)。

在REPL或由REPL執行的腳本中,此限制不適用。另外,實施可以通過解除限制來擴展標準語言。

與當前全球環境最接近的相當於(interaction-environment)的結果,表示REPL的可變環境(如果有的話)。如果REPL沒有被使用或者不存在,你可以通過調用environment模擬一個當前但不可改變的環境,該參數對應於當前的任何一組導入。 R7RS與其前任一樣,沒有任何詞彙環境表示。

相關問題