我試圖編寫一個方案分析器作爲練習,但我不確定如何實現向量語法。 specification似乎表明輸入矢量的方式是'#(1 2 3)
,這樣的矢量應評估爲#(1 2 3)
。但是,當我在幾個Scheme實現中進行實驗時,#(1 2 3)
也被接受爲有效輸入。這是對規範的普遍實現的擴展嗎?R5RS中未加引號的向量方案
2
A
回答
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的程序時,幾乎沒有錯誤。
相關問題
- 1. 方案R5RS:通過引用
- 2. 正在讀「。」在方案R5RS
- 3. r5rs方案中實現長度(drracket)
- 4. R5RS中的號碼分區
- 5. add1函數從方案到R5RS
- 6. Highchart自動向變量添加引號
- 7. 使用R5RS方案在文件中寫新行
- 8. 方案向量語法
- 9. 將引號添加到R中的一個向量中
- 10. 添加符號方案
- 11. 引述未加引號的變量在shell腳本
- 12. 方案中來自雙引號符號的字符串數據
- 13. PHP - 短魔術引號解決方案
- 14. 未定義的變量或方法添加問題的答案
- 15. 計劃R5RS - 未定義的標識符
- 16. 向來自數組的變量添加雙引號
- 17. 草案中的嵌套塊引號JS
- 18. 檢測方案代碼中引號的函數
- 19. Asterisk防止撥號方案連續重複的撥號方案
- 20. PHP中未定義的索引。通用解決方案需要
- 21. 引用方案中的未定義標識
- 22. 引號中的變量C++
- 23. r5rs中的哈希表
- 24. 答錄機撥號時Asterisk撥號方案未運行
- 25. 是什麼複雜的號碼「@」符號在R5RS
- 26. 正則表達式將引號添加到未加引號的表達式
- 27. 簡明的方案R5RS定義結構或類與多個字段
- 28. 添加變量的jquery內部引號
- 29. 單引號的變量添加在Python
- 30. JavaScript中的+號的替代方案