實現scheme直譯器的疑問

2021-06-21 21:33:27 字數 1034 閱讀 1523

(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 實現)

本部落格旨在個人總結回顧 直譯器模式 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。說明 優點 可擴充套件性比較好,靈活。增加了新的解釋表示式的方式。易於實現簡單文法。缺點 可利用場景比較少。對於複雜的文法比較難維護。直譯器模式會引起類膨脹。直譯器模...