programming-languages學習筆記--第6部分
阿新 • • 發佈:2018-12-30
programming-languages學習筆記–第6部分
目錄
1 無datatype
動態型別語言中不需要,只需要基本型別和cons.
2 Racket中的struct
(struct foo (bar baz quux) #:transparent)
3 structs的優點
定義資料型別更簡潔,減少誤用。
可以結合模組系統隱藏建構函式,強制不變式。
4 實現程式語言
典型的工作流:
- 具體語法(sring): "(fn x => x + x) 4"
- 解析器(生成ast): 發現錯誤/警告
- 型別檢查: 分析ast,發現錯誤/警告
實現一個程式語言B的方法:
- 用另外一個語言A寫一個直譯器(執行器),接受一個程式B併產生結果
- 用另外一個語言A寫一個編譯器(轉換器),轉換為語言C,轉換必須保證語義等價。
稱A為metalanguage
不管是直譯器、編譯器或兩者結合,都是一個具體語言的實現,不是語言定義。 所以沒有一種語言比另一種語言快的說法,是語言實現的不同。
5 Interpreter
直譯器可以假定什麼
合法AST:
- 直譯器必須處理的tree
- 可以假定解構欄位的型別正確
- 不合法的AST可以導致直譯器崩潰
對於直譯器,metalanguage中的function可以作為解釋語言的Macros.用函式接受實現語言的語法, 並返回實現語言的語法,就是巨集。
6 variable and env
變數定義,環境用於對映變數到值。
7 實現閉包
env,fun
求值函式表示式:
- 函式不是一個值,closure是一個值。 求值函式返回一個closure
- 當函式求值時,建立一個包含函式和當前環境的closure
函式呼叫: (call e1 e2)
- 使用當前環境求值e1到一個閉包
- 使用當前環境求值e2到一個值
- 在閉包的環境中求值閉包的函式體:需要新增
- 對映函式引數名到引數值
- 對於遞迴,對映函式名到整個閉包
Created: 2018-12-30 Sun 12:37