跳至內容

GNUSmalltalk

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

GNU Smalltalk是 Smalltalk 程式語言的 GNU 計畫實現。

這个實現毋是佮其他 Smalltalk 環境,用文本文件作為程序輸入,並共解說共解說 Smalltalk 代碼。佇這種方式下跤,GNU Smalltalk 表現了閣較親像一種解說器,非傳統 Smalltalk 方式下的一種環境。GNU Smalltalk 包括著真濟自由軟體庫的縛定,包括講 SQLite、libSDL、cairo、gettext 和 Expat 等。

簡單例

下跤的例會當做工課佇 GNU Smalltalk 三更零佮以後版本上。經典的 Hello , World ! 例:

GNU Smalltalk 聲明三个文件:` stdin `、` stdout ` 和 ` stderr `,做文件串流類(` FileStream `)的全局實例,並縛定矣傳達予 C 虛擬機的值。對象類(` Object `)定義矣特有於 GNU Smalltalk 的四个方法:` print `、` printNl `、` store ` 和 ` storeNl `。𪜶對接收者做一改 ` printOn : ` 抑是 ` storeOn : ` 至 ` Transcript ` 對象。這个對象是文本搜集的器類(` TextCollector `)唯一實例,伊通常將寫操作委託予 ` stdout `。

一寡基本的 Smalltalk 代碼:

兩个 ` " ` 包圍的是注釋;` $ c ` 是字符常量 ` c `;兩个 `'` 包圍的是字符合,字符合串中的 `` 是 `'` 伊的轉義序列。

搜集

構造佮使用一个數組:

構造佮使用一个散列表,伊是散列搜集類(` HashedCollection `)的子類即字典類(` Dictionary `)的實例:

GNU Smalltalk 佇字符串類(` String `), 和成做伊的超類的數組式搜集類(` ArrayedCollection `)之間,閣介入特有的字符數組類(` CharacterArray `), 伊的 ` % ` 方法,共接收者內底有的特殊轉義序列,替換做由參數予出的搜集中的元素,其中 ` % n ` 予人替代為這个搜集的第 ` n ` 個元素(` 一 <=n <=九 ` 抑是 ` A <=n <=Z `)。 遮予伊的搜集,是佇咧 ` { ` 和 ` } ` 之間包圍的,當前 Smalltalk 變體一般攏提供的動態數組,其中的元素會當佇運行的時間求值。

塊佮迵天代器

參數傳達到是咧共閉包的一塊:

對一个方法返回由兩个閉包構成的一个數組:

遮咧用 ` extend ` 為存的類擴展新方法是 GNU Smalltalk 特有的語法。

下跤的考拉茲猜想例,展示會共兩塊傳達予接收者,而且會結果信息發送轉到調用者:

搜集類(` Collection `)的 ` collect : ` 方法,將接收者的逐个元素傳達予一塊來求值,倒轉來這个結果的搜集。這類似函數式編程語言當中 map 函數。譬如講計算對 ` 一 ` 到 ` 十 ` 的平方:

迵天代類(` Iterable `)定義矣由子類實現的 ` do : ` 方法,共一塊迵天代接收者的每一个元素之上。這嘛予人號做迵天代器。比如迵天代數組佮區間之上:

迵天代類的 ` inject : into : ` 方法,接受一个參數佮一塊二者;伊迵天代接收者每一个元素之上,佇咧其上執行某一个函數並保持結果為一个聚集。這類似函數式編程語言當中 foldl 函數。這个方法是憑藉調用 ` do : ` 方法去實現的。比如講:

佇第一个逝時,這个塊接受 ` 十 `(愛注入的實際參數)做為 ` sum `,和 ` 一 `(這个數組的第一个元素)做元素,結果為著 ` 十一 `。` 十一 ` 來成做佇後一逝的時陣 ` sum `,這个時陣向伊加上 ` 三 ` 得著 ` 十四 `。` 十四 ` 來加上講 ` 五 `,終其尾閣倒轉來 ` 十九 `。

塊會當佮足濟內底起的方法做伙做工課,下跤例向一个文件寫一行文本,才閣讀伊的每一逝並顯示:

文件類(` File `)伊的特有於著 GNU Smalltalk 的 ` name : ` 方法,倒轉來有絕對路徑的文件名。GNU Smalltalk 有特有的文件路徑類(` FilePath `), 伊的 ` withWriteStreamDo : ` 方法,著接收者調用 ` writeStream ` 方法拍開一个干焦寫的文件串流類(` FileStream `)實例,咧其實調用一塊,並且佇這塊的動態範圍結束處保證(` ensure : `)關起來這个串流;伊的 ` readStream ` 方法,佇接收者頂懸拍開一个干焦讀的文件串流類(` FileStream `)實例。

串流類(` Stream `)伊的特有於著 GNU Smalltalk 的 ` linesDo : ` 方法,對伊的接收者每一逝攏有值伊的參數角一擺。佇咧 GNU Smalltalk 中,文件串流類(` FileStream `)的超類,不再是做為可定位串流類(` PositionableStream `)子類的讀寫串流類(` ReadWriteStream `), 是其實特有的做串流類(` Stream `)子類的文件描寫符類(` FileDescriptor `), 伊的 ` close ` 方法關起來這个文件。

GNU Smalltalk 建立新類採用特有的語法形式:

類似的,為存的類擴展新方法採用特有的語法形式:

佇咧 Smalltalk 有關冊內底有一个定定看著版式約定,共一个類當中的方法引用 ` 徛名 > > 方法名 `,這毋是啦 Squeak / Pharo 語法的一部份,GNU Smalltalk 將 ` 徛名 class > > 方法名 ` 做定義類方法的語法形式。

下跤的代碼定義叫做 ` Person ` 的一个類似,這个類有兩个實例變量 ` name ` 和 ` age `,𪜶有家己的變化佮子佮訪問子。定義有兩个關鍵字參數的類方法,用來創建新的類實例。單獨用的 ` age ` 來做較的 ` < ` 方法,通過對 ` Magnitude ` 派生,這个類自動繼承了所有的其他較方法的定義。這類閣通過覆寫 ` printOn : ` 的方式,定製這个對象的列印(` print `)/ 顯示(` display `)方式:

遮咧用 ` asSortedCollection ` 方法對搜集進行排序,然後用 ` reverse ` 方法來做反轉。最後結果是揤 ` age ` 反序列印三个人的批信:

異常

欲發起會當掠著的異常,愛調用異常類(` Exception `)佮其子類的 ` signal ` 抑是 ` signal : ` 方法。錯誤類(` Error `)表示袂當恢復的致命錯誤,警告類(` Warning `)表示重要但是會當恢復的錯誤,停機類(` Halt `)表示通常是空隙(bug)的會當恢復錯誤。比如講:

異常通過塊閉包(` BlockClosure `)的 ` on : do : ` 方法來處理,閣會使干焦掠著特定的各樣(佮𪜶的子類):

處理器仔句使用伊得著的異常對象,退出抑是恢復一塊;退出是預設的,但是嘛會當顯式的指示:

佇咧因為各樣欲進入調試器,會當調用對象類(` Object `)的 ` halt ` 方法,抑是增加一个消息參數的 ` halt : ` 方法;這兩个人實際上調用著對象類的 ` error : ` 方法,伊通過原始操作停止執行佮抑是啟動調試器,並且展示這个錯誤消息:

參見

  • Ruby 語法
  • GLASS

引用

外部連結

  • 官方網站