[譯]用javascript實現一門程式語言-語言構想

Alongite發表於2018-07-30

目錄

  1. 用javascript實現一門程式語言-前言
  2. 用javascript實現一門程式語言-語言構想
  3. 用javascript實現一門程式語言-寫一個解析器
  4. 用javascript實現一門程式語言-字元輸入流

關於 λanguage 的一些構想

對,我們要實現的語言就叫它 λanguage 吧。

正確的程式設計方式,是應該先有明確的思路和邏輯。所以我們應該把 λanguage 的語言特性羅列到這裡,但是在這個教程中,我就較為隨意的放幾個例子來解釋語言特性吧。

# 這裡是註釋

println("Hello world");

println(2 + 3 * 4);

# 通過 lambda 這個關鍵字來宣告函式
fib = lambda (n) if n < 2 then n else fib(n - 1) + fib(n - 2);

println(fib(15))

print-range = λ(a, b)
                if a <= b then {
                    print(a);
                    if a + 1 <= b {
                        print(", ");
                        print-range(a + 1, b);
                    } else println("");
                }

print-range(1, 5);
複製程式碼

你應該注意到上面的變數名稱包含 - 號,這是根據個人偏好來設定的,因為作者不喜歡使用駝峰命名,也不喜歡使用下劃線。自己實現一個程式語言的好處就是,你可以自定義它的語法。

上面程式碼的輸出如下:

Hello world
14
610
1, 2, 3, 4, 5
複製程式碼

λanluage 可能看起來跟 javascript 很像,但是它們是不一樣的。

  • λanguage 是不需要宣告變數的,只有表示式
  • 一個表示式的返回值可以用在其他表示式中
  • 分號用來分割語句
  • 用花括號來建立一個塊,返回值是最後一條語句的值,花括號也是一種表示式

以下的程式是合法的:

a = {
    fib(10); # 沒有任何副作用,但是還是會執行
    fib(15)  # 最後一個分號可以省略
};
print(a); # 列印出 610
複製程式碼

函式是通過 lambda 或者 λ 來宣告。在關鍵字的後面需要跟被括號包裹的形式引數,如

fib = lambda(num) num + 1;
複製程式碼

關鍵字後面是單句表示式,但是可以通過{}來生成一個程式碼塊。表示式的最後一個語句的執行結果會作為返回值傳給呼叫者。

注意沒有var, 你可以通過類似javascript中的立即執行函式 (IIFE) ,來宣告一個變數。可以通過 lambda 宣告一個變數作為引數。 變數是術語塊級作用域。函式類似於javascript中的閉包。

javascript 中的三元表示式可以寫成這樣:

a = foo() ? bar() : baz();  // javascript
a = if foo() then bar() else baz();  # λanguage
複製程式碼

在有{ 的情況下 then 關鍵字可以被省略,如上面的print-range。其他的都是必須的,通過else建立另一個條件分支。當表示式中 else 缺失,並且if判斷為false時,if表示式將會返回 false。語言中除了false以外,都會被解析成true,包括數字0和空字串。

注意,我們需要在每一個表示式後面用分號作為結束。


好了,這就是關於我們λanguage語言的介紹,雖然它看起來像個玩具,並且缺少很多特性,如陣列、物件等,但是都是在這些的基礎上展開的,如果你能很好的理解掌握我們的教程,其他的語法特性都不是問題。

原文連結: lisperator.net/pltut/dream

相關文章