語言是我們向計算機系統表達自身需求的方式,在我看來,語言種類多多益善。Blue 是一種獨特的面向對象的開源語言,使用直觀而且用途廣泛。本文提供 Blue 基礎知識,向您展示如何構建簡單的網路應用程序。
身為一名軟體工程師,我一直為編程語言著迷。不管是典型的命令式語言(例如 C 語言)、函數式語言(例如 Scheme)或者面向對象的語言(例如 Ruby),其語法、設計和實現中都有吸引人之處。和自然語言相似,編程語言是我們同機器進行交流、說明自身意圖的方式。但並非所有語言都是相同的,每種語言都提供了獨特而有趣的問題解決方法。
Blue 語言就提供了一種獨特的問題解決方法。Blue 是一種動態類型的面向對象語言,還是多范型的 — 意指它支持多種語言風格的范型(例如混合了面向對象語言和函數式語言)。從解決問題的角度看,這很有用,因為這允許您混合風格,以最有效的方法解決單一問題。
|
在深入地對 Blue 進行更技術性的介紹之前,要注意本文研究的是 Erik Lechak 開發的 Blue 編程語言,而不是 Monash University 開發的 Blue 編程語言。
使用 Blue 的動機
Blue 是一種具有獨特功能的動態編程語言。它設計為跨平台、多范型的語言,具有簡單而一致的語法。Blue 是解釋型的,但也可編譯為位元組碼以實現更高性能。但最引人注目的是,Blue 遵循極簡主義。它是一種具備最簡單特性的豐富、可表達的語言。例如,許多語言有大量方法來實現迭代。而在 Blue 中,忽略了遞歸或映射(函數迭代器),只有一種方法來實現循環結構。
語言特性
本文不可能完整地介紹 Blue,但查看一些較為值得注意的特性將幫助您更好地理解此語言。本節研究了類型、條件、迭代、錯誤捕獲和類,然後有兩個略大型的 Blue 應用程序將這些元素結合起來。
類型
Blue 包含許多內置類型,包括數字(包含整型和浮點型)、字元串、數組、函數等等。Blue 的調用是動態分類的,這意味著您可以簡單地將一個變數與一個值關聯(不要求定義變數)。清單 1 中的示例說明了如何創建多種類型的變數(整型、浮點、字元串、數組和函數)。
x = 9; y = 3.14159; s = "this is a string"; a = [1, 2, 3, 5, 8]; f = func{ arg name; sys.print( "Hello ", name, "\n" ); }; sys.print( f("Marc") ); sys.attribs( &s ).print(); |
最後一行給出了特定字元串類型的屬性。這些屬性是該類型的本地類型屬性(或成分)。當針對變數類型執行 attribs 函數時 — 該變數使用 typeof 運算符 (&) 進行檢索,結果為:
[replace,repeat,num,ltrim,length,import,endsWith,compile,find,eval,load,print, substr,rtrim,save,startsWith,split,trim] |
這些方法看上去與典型的字元串對象方法應該很相似。您還能使用 attribs 方法來處理對象本身(而不是類型),這可提供對象本身的屬性。
條件
在 Blue 中,條件 這種表達式取代了語句。這意味著您能使用條件來代替值,可使代碼更簡單、更乾淨。在 Blue 中,條件的形式為:
condition ? true-expression ; condition ? true-expression : false-expression ; |
如是,您以表達式開頭,並提供一或兩個選項(真或偽路徑)。清單 2 提供了兩個例子。這些簡單的案例中提供了表達式,但它們也可以是規定多條語句的代碼塊(使用花括弧)。
foo = 2; (foo == 2) ? sys.print("foo is 2\n"); (foo == 1) ? sys.print("foo is 1\n") : sys.print("foo is not 1\n"); |
迭代
Blue 提供單一的循環機制,包含於代碼塊之內。代碼塊就是將返回一個值的一組代碼,如果沒有返回值,那麼會返回一個 NULL 對象。對象塊定義如下所示。
z = { x = 1; y = x+3; return y; }; sys.print( z ); |
清單 4 顯示了以這種模式構建的迭代(從 10 到 1 計數):
sum = 0; value = 10; ret = loop { sum = sum + value; value = value - 1; (value == 0) ? return sum; }; sys.print( ret ); |
在此示例中,代碼塊迭代,直至循環根據條件而中斷。然而僅僅使用簡單的循環結構,您也能構建任意複雜的循環。
捕獲錯誤
Blue 實現的一種異常系統與 Java 編程語言有幾分相似,但經過了簡化。在 Blue 中,您 “提出(raise)” 異常(而 Java 是 “拋出(throwing)” 異常)。您還能 “捕捉(catch)” 異常,以便使用錯誤捕獲運算符(|)來管理 Blue 中的錯誤。本節提供了一些實例來展示其工作方式。
異常處理的最常見用法是中斷一個函數,將異常提交給調用程序(可能是該調用程序,或者是堆棧中上級調用程序)。在清單 5 所示設計示例中,我驗證所傳遞的參數,如果它是無效的,我就提出異常。Blue 的獨特之處在於您能將任何對象提出為異常。在調用程序上,我使用錯誤捕獲運算符來捕獲異常。我發出錯誤信息,將返回值替換為 0(請記住:每個內聯代碼塊都返回一個對象)。
z = func { arg my_arg; (my_arg == 0) ? raise -1; return 10 / my_arg; }; x = z( 0 ) | { sys.print("error\n"); return 0; }; |
這種方法的另一個更簡單的有趣用例是,為參數提供默認值。您能夠使用清單 6 中所示代碼行來為缺失的參數指定默認值。在這個用例中,如果用戶調用沒有參數的函數 z,則 1 被用作默認值。
z = func { arg my_arg | 1; ... }; |
最後如清單 7 所示,您能實現對代碼塊進行異常處理的傳統用例。這個典型用例涵蓋了要管理異常的整個塊。
{ first_func(); second_func(); ... } | { # Manage errors for the block } |
類
Blue 也採用了明確的極簡方法來進行面向對象編程。在 Blue 中,您可創建新類、類的繼承,或擴展類。為創建新類,我首先使用 sys.class() 函數。它返回一個新的空類,我能向此空類添加屬性。清單 8 研究了角色類的創建,此類可用於簡單的角色扮演遊戲。我現在能向這新的空類填充屬性,諸如字元串和數字類型(代表了角色的成分),以及這個類中常用的函數。注意我提供了 3 個函數:構造器、銷毀器和狀態函數(狀態函數發出對象實例所代表的角色的信息)。
# # Character Class # Character = sys.class(); Character.name = ""; Character.weapon = ""; Character.hp = 0; # Constructor Character._ = func { arg name | { name = "anonymous"; }; arg weapon | { weapon = "stick"; }; arg hp | { hp = 10; }; this.name = name; this.weapon = weapon; this.hp = hp; }; # Destructor Character.__ = func { sys.print( this.name, " is dead.\n" ); }; # Class method Character.status = func { sys.print( this.name, " (HP ", this.hp, ") wields a ", this.weapon, ".\n" ); }; |
[火星人 ] Blue 編程語言 簡單性和極簡主義已經有725次圍觀