2013-09-05 46 views
2

我試圖編寫一個方案分析器作爲練習,但我不確定如何實現向量語法。 specification似乎表明輸入矢量的方式是'#(1 2 3),這樣的矢量應評估爲#(1 2 3)。但是,當我在幾個Scheme實現中進行實驗時,#(1 2 3)也被接受爲有效輸入。這是對規範的普遍實現的擴展嗎?R5RS中未加引號的向量方案

回答

1

根據R RS SPEC,載體必須被引用:

注意,這是一個矢量的外部表示,而不是評估到一個向量的表達式。喜歡清單常數,向量常數必須用引號括:

'#(0 (2 2 2 2) "Anna") 

一些實現選擇允許不帶引號的載體的評價,但任何這種擴展是非標準的,而具體實現的「功能」。


對於它的價值,即將到來的R7RS spec明確要求向量自我評價:

向量常數是自我評價,所以他們並不需要在程序中被引用。

1

並不普遍。例如,Chicken不允許您評估未加引號的向量。

#;1> #(1 2 3) 

Error: illegal non-atomic object: #(1 2 3) 
#;1> '#(1 2 3) 
#(1 2 3) 
1

關於標準和實現的有趣的事情。一個實現可以給你很多功能,只要它們不與規範相沖突。所以有一個實現需要#(1 2 3)來評估,就好像它是自我評估一樣,因爲這肯定不會發生在符合R5RS的程序中。在R5RS中,運行不符合R5RS的程序,如

(define test "hello") 
(string-set! test 0 #\H) 

未定義。它可能會失敗,不會改變測試或改變測試。 R6RS也是如此,但實施可能表示出現錯誤 - 但仍不一定。

AFAIK racket有最嚴格的R5RS,但即使他們的實施還有額外的麻煩。例如。他們允許規範中不允許使用的符號和they have symbols defined in their report-environment在球拍模塊系統中提升R5RS。但是,與所有實現一樣,在給出符合R5RS的程序時,幾乎沒有錯誤。