2011-09-23 23 views
7

我正在看書Structure and Interpretation of Computer Programs,我想逐漸編寫一個方案解釋器。我想實現一個方案解釋器來學習SICP

你知道該計劃的實施最容易閱讀(和簡短)嗎? 我會讓一個JavaScript在C.

+1

閱讀SICP後,在我看來,您會更喜歡在Scheme中(或其他Lisp方言 - 我喜歡Clojure)編寫解釋程序,並且執行一些練習,而不是編寫解釋程序在C. – mwd

+2

你到SICP有多遠?在閱讀第4章和第5章的過程中,你會寫一個Scheme解釋器(實際上是一個以上的)和一個編譯器。如果你完成了這本書,你將找到你所尋求的:元語翻譯(Scheme in Scheme)非常漂亮短。 – spacemanaki

回答

4

Christian Queinnec的書Lisp In Small Pieces is superb。 EoPL更現代。涵蓋了Lisp和Scheme,並詳細介紹了大多數書籍忽略的血腥低級內容。

+0

它也不是很適合初學者。 – leppie

1

我會推薦閱讀Kent Dybvig的論文「Three Implementation Models for Scheme」。不是整篇論文,但是第一部分(到第3章)他討論基於堆的模型非常適合簡單實現Scheme。

另一個很好的資源(如果我正確地理解它並且你想用C實現它)是Nils Holm's "Scheme 9 from Empty Space"。這個鏈接到Nils的頁面,底部有一個鏈接,指向舊版本的公有領域,以及更新,更易於閱讀的商業版本。閱讀並愛他們。

0

方案的解釋,我可以給你我的翻譯是如何工作的概述,也許它可以給你的東西一般的想法。 雖然答案很晚,但我希望這可以幫助別人,誰已經來到這個線程,並希望有一個大致的想法。

  1. 對於輸入的每一行方案,都會創建一個Command對象。如果該命令是不完整的,則會存儲它的嵌套層級(剩餘的右括號來完成表達式)。如果命令完成,則會創建一個表達式對象,並在該對象上觸發評估器。
  2. 有4種類型評價者類的定義中,每個從基類計算器衍生

一個)Define_Evaluator:用於定義語句

b)中Funcall_Evaluator:用於處理其它用戶定義的函數

c)Read_Evaluator:用於讀取表達式並將其轉換爲方案對象

d)Print_Evaluator:根據對象的類型打印對象。 e)Eval_Evaluator:處理表達式的實際處理。

3 .->首先使用Read Evaluator讀取每個表達式,該讀取評估器將從表達式中創建一個方案對象。遞歸計算嵌套表達式,直到表達式完成。

- >接下來,觸發Eval_Evaluator,它處理在第一步中形成的方案表達式對象。 發生這種情況如此

a)如果要評估的表達式是一個符號。返回它的值。因此變量blk將返回該塊的對象。 b)如果要評估的表達式是列表。打印列表。

c)如果要評估的表達式是函數。查找將使用Funcall_Evaluator返回評估的函數的定義。

- >最後打印評估器被打開以打印結果,此打印將取決於輸出表達式的類型。

免責聲明: 這是我的翻譯是如何工作的,不必須是這樣的。

0

我一直在一個類似的使命,但幾年後,建議:從頭

我仍然在尋找關於創建一個lisp/scheme虛擬機的好博客帖子,它可以與JIT(對於任何競爭性JS實現都很重要:)相結合。

相關問題