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

目錄

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

關於 λanguage 的一些構想

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

正確的編程方式,是應該先有明確的思路和邏輯。因此咱們應該把 λanguage 的語言特性羅列到這裏,可是在這個教程中,我就較爲隨意的放幾個例子來解釋語言特性吧。java

# 這裏是註釋

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 很像,可是它們是不同的。bash

  • λanguage 是不須要聲明變量的,只有表達式
  • 一個表達式的返回值能夠用在其餘表達式中
  • 分號用來分割語句
  • 用花括號來建立一個塊,返回值是最後一條語句的值,花括號也是一種表達式

如下的程序是合法的:閉包

a = {
    fib(10); # 沒有任何反作用,可是仍是會執行
    fib(15)  # 最後一個分號能夠省略
};
print(a); # 打印出 610
複製代碼

函數是經過 lambda 或者 λ 來聲明。在關鍵字的後面須要跟被括號包裹的形式參數,如編程語言

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

關鍵字後面是單句表達式,可是能夠經過{}來生成一個代碼塊。表達式的最後一個語句的執行結果會做爲返回值傳給調用者。函數

注意沒有var, 你能夠經過相似javascript中的當即執行函數 (IIFE) ,來聲明一個變量。能夠經過 lambda 聲明一個變量做爲參數。 變量是術語塊級做用域。函數相似於javascript中的閉包。post

javascript 中的三元表達式能夠寫成這樣:ui

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

相關文章
相關標籤/搜索