(1). define 和 set! 在本質上的區別我知道, 就是set!是改變原來變數上的值, define是新建立乙個值. 但是對使用者來說, 在一般函式式語言裡面好像也沒什麼區別,
實現define的時候實現成set!了, 但是用起來一模一樣! 我的直譯器的實現沒辦法按r5rs標準的那樣實現define了...或許之後引入了非純函式式的那部分語法就要用到到set!和define的區別...
(2). `()` 到底算什麼元素 ? (list) 和 '()都會出來`()`...
算空list ? 算symbol ? 算乙個特殊的標誌 ? 我知道絕對不算null !
雖說在絕大部分情況下都可以用null代替 (), 但它們倆畢竟不是一回事兒啊!
蜀黍說算空list, 那既然說list的本質是pair, 那怎麼用pair來構造出 () ?
貌似在r5rs上定義了()為空list, 就先像蜀黍那樣用乙個變數empty代替吧...
(3). 實現裡面其實list和pair是分開的=_=, 雖說用起來是沒問題的...這是為了方便, 內部實現的list和pair是分開了...
(4). 寫錯誤恢復的時候有這麼樣個問題.
(define a 1)
(+ (define a 2) b)
a
上面的**在不同直譯器上會有不同的結果. 在guile上結果是1, 在bigloo上結果是2. 原因很簡單, guile是先一整個表示式先check一遍(跟parse不同啦, 懶的解釋), 都合法了才eval, bigloo是邊check邊eval, 所以check到(+ (define a 2) b) 的b時發現b未定義之前(define a 2)已經eval過了..
不知道是不是scheme標準沒定義清楚, 不過bigloo的這種策略比較好寫, 就用這中策略了.
(5). gc原理不難, 但是實現起來好麻煩, 放棄了...tail recursion也放棄了...巨集...待定...
csdn的**片功能是作秀嗎? 粘到gist上再嵌入script**在這裡顯示空白.
Emacs下使用scheme直譯器
安裝之後,為了防止安裝路徑中特殊字元引起的麻煩,我將其中的可執行部分單獨拷貝到乙個容易查詢的地方 mit scheme 然後開啟 emacs配置檔案,並新增以下內容 scheme setenv mitscheme library path mit scheme add to list exec pa...
我的第乙個直譯器 scheme
scheme是這個暑假弄的,實現了一下它的基本框架 我的實現比較學術,畢竟是看了編譯原理的前5章,之後弄的,所以思路簡潔清晰!q scheme是什麼?a scheme是mit人工智慧實驗室開發的一種lisp方言,一種用括號包圍的語言 q 為什麼是scheme?q 我的直譯器用的是怎樣的分段開發?a ...
直譯器模式(C 實現)
本部落格旨在個人總結回顧 直譯器模式 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。說明 優點 可擴充套件性比較好,靈活。增加了新的解釋表示式的方式。易於實現簡單文法。缺點 可利用場景比較少。對於複雜的文法比較難維護。直譯器模式會引起類膨脹。直譯器模...