1. 程式人生 > >programming-languages學習筆記--第6部分

programming-languages學習筆記--第6部分

programming-languages學習筆記–第6部分

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到一個值
  • 在閉包的環境中求值閉包的函式體:需要新增
    • 對映函式引數名到引數值
    • 對於遞迴,對映函式名到整個閉包

作者: ntestoc

Created: 2018-12-30 Sun 12:37