Blue 編程語言 簡單性和極簡主義

火星人 @ 2014-03-12 , reply:0


  
語言是我們向計算機系統表達自身需求的方式,在我看來,語言種類多多益善。Blue 是一種獨特的面向對象的開源語言,使用直觀而且用途廣泛。本文提供 Blue 基礎知識,向您展示如何構建簡單的網路應用程序。

身為一名軟體工程師,我一直為編程語言著迷。不管是典型的命令式語言(例如 C 語言)、函數式語言(例如 Scheme)或者面向對象的語言(例如 Ruby),其語法、設計和實現中都有吸引人之處。和自然語言相似,編程語言是我們同機器進行交流、說明自身意圖的方式。但並非所有語言都是相同的,每種語言都提供了獨特而有趣的問題解決方法。

Blue 語言就提供了一種獨特的問題解決方法。Blue 是一種動態類型的面向對象語言,還是多范型的 — 意指它支持多種語言風格的范型(例如混合了面向對象語言和函數式語言)。從解決問題的角度看,這很有用,因為這允許您混合風格,以最有效的方法解決單一問題。

多范型語言
雖然多范型語言不一定是新出現的,但它們必定增添了現代編程語言的可表達性。常見的多范型語言包括 C++、Ruby、Ada、Python、Java™ 等眾多編程語言。有些使用了兩或三種范型樣式,而有些使用了多達 8 種(例如 Mozart 編程系統的 Oz 語言)。

在深入地對 Blue 進行更技術性的介紹之前,要注意本文研究的是 Erik Lechak 開發的 Blue 編程語言,而不是 Monash University 開發的 Blue 編程語言。

使用 Blue 的動機

Blue 是一種具有獨特功能的動態編程語言。它設計為跨平台、多范型的語言,具有簡單而一致的語法。Blue 是解釋型的,但也可編譯為位元組碼以實現更高性能。但最引人注目的是,Blue 遵循極簡主義。它是一種具備最簡單特性的豐富、可表達的語言。例如,許多語言有大量方法來實現迭代。而在 Blue 中,忽略了遞歸或映射(函數迭代器),只有一種方法來實現循環結構。





語言特性

本文不可能完整地介紹 Blue,但查看一些較為值得注意的特性將幫助您更好地理解此語言。本節研究了類型、條件、迭代、錯誤捕獲和類,然後有兩個略大型的 Blue 應用程序將這些元素結合起來。

類型

Blue 包含許多內置類型,包括數字(包含整型和浮點型)、字元串、數組、函數等等。Blue 的調用是動態分類的,這意味著您可以簡單地將一個變數與一個值關聯(不要求定義變數)。清單 1 中的示例說明了如何創建多種類型的變數(整型、浮點、字元串、數組和函數)。


清單 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 提供了兩個例子。這些簡單的案例中提供了表達式,但它們也可以是規定多條語句的代碼塊(使用花括弧)。


清單 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 對象。對象塊定義如下所示。


清單 3. 如何定義代碼塊
				  z = {    x = 1;    y = x+3;    return y;  };    sys.print( z );  

清單 4 顯示了以這種模式構建的迭代(從 10 到 1 計數):


清單 4. 迭代示例
				  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(請記住:每個內聯代碼塊都返回一個對象)。


清單 5. 異常處理示例
				  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 被用作默認值。


清單 6. 為缺失的參數指定默認值
				  z = func {    arg my_arg | 1;      ...    };  

最後如清單 7 所示,您能實現對代碼塊進行異常處理的傳統用例。這個典型用例涵蓋了要管理異常的整個塊。


清單 7. 對代碼塊的異常處理
				  {    first_func();    second_func();    ...  } | {      # Manage errors for the block    }  

Blue 也採用了明確的極簡方法來進行面向對象編程。在 Blue 中,您可創建新類、類的繼承,或擴展類。為創建新類,我首先使用 sys.class() 函數。它返回一個新的空類,我能向此空類添加屬性。清單 8 研究了角色類的創建,此類可用於簡單的角色扮演遊戲。我現在能向這新的空類填充屬性,諸如字元串和數字類型(代表了角色的成分),以及這個類中常用的函數。注意我提供了 3 個函數:構造器、銷毀器和狀態函數(狀態函數發出對象實例所代表的角色的信息)。


清單 8. 角色類
				  #  # 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" );  };  




[火星人 via ] Blue 編程語言 簡單性和極簡主義已經有91次圍觀

http://www.coctec.com/docs/linux/show-post-68763.html