跳至內容

Dylan語言

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

Dylan是多範式的程式語言,包括支援函數式佮物件導向程式設計(OOP), 伊是動態佮反射式的,煞提供設計用佇支援生做高效機器碼的編程模型,包括佇咧動態佮靜態行為頂懸的細粒度的控制。伊是佇一九九空年代早期由蘋果公司領導的群組創造的。

概述

佇咧 Dylan 參考手冊內底有足簡明的徹底的語言概述。Dylan 衍生自 Scheme 和 Common Lisp,並且增加了衍生自 Common Lisp 東西系統(CLOS)的整合的物件系統。佇咧 Dylan 中,彼个所有的值(包括數值、字元、函式和類)攏是頭等等的物件。Dylan 支援多重繼承、多型、多分派、關鍵字參數、物件內省、是因為模式的語法擴充宏佮真濟其他進階特徵。程式會當表達佇咧動態性上的細粒度的控制,允准程式占佇咧動態佮靜態編程之間的連續區,並支援演進式開發(允准先快速原型隨後增進精製和最佳化)。

Dylan 的主要設計目標是成做適合開發商業軟體的動態語言。Dylan 試看覓影決潛在的效能問題,通過向完全靈活性的 Lisp 系統介入「本性」限制,允准編譯器清楚的理解會當編譯單元比如函式庫。Dylan 對 Scheme 佮其他 Lisp 衍生出著伊的足濟語意;某寡 Dylan 實現上頭起佇咧現存 Lisp 系統之內。猶毋過 Dylan 有類似 ALGOL 的語法相𫝛是一个類似 Lisp 字條語法。

歷史

Dylan 是佇一九九空年代早期由蘋果公司領導的一个群組建立的。佇伊的開發的時陣,伊予意圖用佇咧 Apple Newton 電腦,猶毋過 Dylan 實現彼陣猶無達到充分成熟,而且 Newton 轉來使用矣 C 和 Walter Smith 開發的 NewtonScript 二者的混合。Apple 佇咧一九九五年尾止矣其實 Dylan 開發努力,就算講𪜶製作一个真接著的「技術發行」版本(Apple Dylan TR 一), 並且包括一个進階整合式開發環境(IDE)。

其他兩个小組對語言設計佮開發實現做出了貢獻:Harlequin 公司發行矣 Microsoft Windows 下的商業 IDE,卡內基 ・ 梅隆大學發行矣叫做 Gwydion Dylan 的 Unix 下跤的編譯器。二者的實現分別於二空空四年和一九九八年開放矣原始碼。Harlequin 實現早當咧叫做 Open Dylan 並且由一組志願者維護。

Dylan 語言的代號是 Ralph。James Joaquin 選擇名 Dylan 表示「動態語言」(Dynamiclanguage)。

語法

Dylan 的多數語法特徵來自伊的 Lisp 傳承。Dylan 頭仔咧使用類似 Lisp 字條語法,伊敢若是 S-表達式。到甲語言設計完成的時陣,語法予人變更做類似 ALGOL 的語法,預期廣泛的編程者受眾會閣較熟似伊。語法由 Michael Kahl 設計的。伊佇咧 Dylan 來參考手冊有詳盡描寫。

詞法

Dylan 毋是大細寫敏感的。Dylan 的詞法允准使用連字佮減號的號名約定,來連接多單詞識別碼的各部份(有時叫做「lisp-case」抑是「kebab case」)。 這个約束佇咧 Lisp 語言內底是捷看著的,但無適用佇將毋是數值文字一部份的連字號佮減號,當做一个單一詞法記號處理的遐的程式語言,就算佇伊無包圍佇空白字元的時陣。

除了字母數字元佮連字佮減號以外,Dylan 允准特定非字母數字元作為識別碼的一部份。捌別碼袂使單獨的由非字母數字元或數字元組成。若有任何歧義,應使用空白。

樣例代碼

有幾若个溝的一个簡單的類:

佇咧約束頂懸,類使用尖括號(即的小於號佮大於號)來號名,比如講這个代碼例內底的類名 ` < point > `。

佇咧 ` end class < point > ` 中,` class ` 和 ` < point > ` 二者攏是可選的。嘿所有 ` end ` 子句攏是按呢。比如講,通好寫 ` end if ` 抑是唯寫 ` end ` 來終止一个 ` if ` 語句。

仝款的類,會當用極小化的方式重寫:

槽這馬攏確定類型做 ` < object > `。槽著愛予手動初初化。

佇咧約束頂懸,常有數名開始就 ` $ `:

階乘函式:

遮的 ` n ! ` 和 ` < integer > ` 就是正常的識別碼。

遮無顯式的倒轉去語句。一个方法抑是函式的結果是到尾仔求值的彼个表達式。除掉佇回位置的表達式後壁的分號是捷看的風格。

模組佮號名空間

佇足濟物件導向語言內底,類是封裝和模組化的主要方式;每一个類別定義一个號名的空間並控制佗一寡定義是佇外部可見的。進一步的,佇真濟語言中類別定義必須愛予人用做一个整體的不可見單元。比如講,使用 ` String ` 串接函式要求匯入並編譯全部的 ` String `。

某一寡語言的套件括 Dylan,閣包括一个分立的顯式的號名空間或者是模組系統,會當用閣較一般性的方式來進行封裝。

佇咧 Dylan 中,編譯單元和匯入單元的概念是分開的,類對兩个攏無啥物特殊會當講。「庫」定義應當被做伙編譯佮處理的專案,而且「模組」定義一个號名空間。類會當共囥佇咧模組內底,抑是分拆到其中,隨編程者意願。定定是一个類的完全定義無存在佇一个單一的模組內底,是延展佇進行選擇性收集的多個模組至上。無仝的程式會當有仝的類的無仝的定義,而且包括𪜶所需要的。

比如講,考慮支援 ` String ` 的一个附加庫 regex。佇咧某一寡語言內底,一个功能愛予人包括佇字串內底,這个功能著愛予人增加到 ` String ` 號名空間。隨這款代誌不斷發生,` String ` 類變愈來愈大,毋免閣用 regex 的函式猶原需要為增加著庫大細付出代價。為此,這種附加件典型的共囥佇咧𪜶家己的號名空間和物件內底。這種方式的缺點是新函式無閣再是 ` String ` 的一部份;伊轉去予隔離佇單獨聲明的伊家己的函式集合內底。無閣用矣 ` myString . parseWith ( myPattern ) `,對 OO 視角這是自然的組織方式,是使用像 ` myPattern . parseString ( myString ) ` 這款的物件,彼个效果頂懸反轉矣次序。

佇咧 Dylan 之下,會當為相仝代碼的定義誠濟介面,比如講 ` String ` 串接方法會當共囥咧 ` String ` 介面佮 ` concat ` 介面二者內底,後者將無仝的類中的無仝的串接函式收集做伙。這捷用數學庫內底,遮的函式意圖適用廣泛的無仝物件類型。

介面構造的閣較實際用法是建造一个模組的公開佮私有版本,佇咧其他的語言內底這予人包括做一个附帶特徵,並且總是致使問題並增加語法。佇咧 Dylan 之下,所有的函式呼叫會當簡單的囥咧「私有」抑是「開發」介面當中,而共可公開存取的函式收集佇咧 ` Public ` 介面內底。佇咧 Java 抑是 C + + 之下,一个物件的可見性是定義佇代碼中的,意味著愛提供類似的變更,編程者將予人強制的去完全重寫定義,並且袂當同齊有兩个版本。

佇咧 Dylan 中以類似大多數 OO 語言的風格,類似的物件欲描寫 ` slot `(槽,資料成員,欄位,ivar 等)。 所有對槽的存取攏愛通過方法,就親像 Smalltalk 彼款的。預設的 ` getter ` 和 ` setter ` 方法基於槽名而自動生成。著比如講多數其他 OO 語言,會當應用於類的其他方法定定義佇這个類的外部,所以佇遮 Dylan 中類別定義典型的只包括儲存的定義。比如講:

佇這个例中,定義矣類 ` < window > `。` < 徛名 > ` 語法只是約束,予類名顯得通好突出,尖括號只是這个類名的一部份。佮之相對比,佇一寡語言內底,約束做大寫類名的首字母,抑是予名字條頂懸 C 抑是 T(比一个例)。 ` < window > ` 繼續承一个單一類 ` < view > `,並包含二个槽:` title ` 持有這个窗口標題的字串,和 ` position ` 持有這个窗口一角的 X-Y 點。佇這个例中,標題予出為預設值,彼位置猶閣無值。可選的 ` init-keyword ` 語法允准編程者佇咧初初化這个類的物件指定這个槽的初初值。

語言譬論講 C + + 抑是 Java 中,類猶閣定義矣伊的介面。所以佇咧這二種語言內底,若像上述案例中,類別定義無顯式的著可見性的指令,是對資料成員佮方法的存取攏予人當做是 ` protected `,意味著𪜶干焦會當予子類使用。愛予無關代碼使用這个窗口的實例,𪜶著愛予聲明為 ` public `。

佇咧 Dylan 中,遮的槽的可見性規則無予當做是這个代碼的一部份,是一个模組 / 介面系統的一部份。這是增加足大的靈活性。比如講,佇早期開發中用的介面會當聲明所有的物件為 ` public `,毋過用佇咧測試佮部署內底用的介面會加以限制。對於 C + + 抑是 Java,這種變更加會需要改變原始碼,所有的人就無愛做矣,啊若佇咧 Dylan 中,這是完全無關係的概念。

就算講這个例無用著,Dylan 閣支援偌重繼承咧。

方法佮泛化函式

佇咧 Dylan 中,方法毋是講原生的關聯佇咧任何特定的類似;方法會當予人認為存在佇咧這个類以外。就親像 CLOS,Dylan 是因為多分派(多方法)的,遮特定方法的呼叫是因為伊的所有實際參數的類型來選擇的。方法無需要咧編譯時間就知,是因為使用者偏好,所要求的函式會當是得著的嘛會當袂當。

佇咧 Java 之下,仝款的方法予人隔離佇咧特定的類之中。欲使用這个功能,編程者去予人強制去 ` import ` 這个類並顯式的參照伊來呼叫這个方法。抑若這个類袂當得著,或者是這个編譯時間未知,這个應用簡單的袂當編譯。

佇咧 Dylan 中,泛化函式表示零抑是濟類似的方法,用 ` define method ` 方式來建立的所有方法自動的包含佇仝名的泛化函式內底。泛化函式嘛會當顯式的用 ` define generic ` 聲明,允准編程者精確控制會當增加佗一種方法。代碼被隔離佇儲存才佇位泛化函式當中。足濟類佇內底有𪜶家己的方法,因此佇感官頂懸就親像多數其他 OO 語言仝款。但是代碼實際上位佇咧泛化函式內底,意味著𪜶無附屬於特定的類似,並會當予任何人自然的呼叫。下例將類 ` < window > ` 的方法 ` turn-blue ` 併入仝名的泛化函式內底:

這个定義類似其他的語言的定義,並有可能去予人封裝著 ` < window > ` 類之中。注意 ` :=` 這乎 ` setter ` 搧叫,伊是 ` color-setter ( $ blue , w ) ` 的語法糖。

泛化函式的自主利用會當看著遮爾仔譀化的例內底。比如講,多數的語言內底的一个常見函式 ` to-string `,伊閣轉去這个物件的某種人類會當讀形式。比如講一个窗口可能倒轉來伊的標題佮伊佇咧爸窗口內底的位置,啊若一字串將返回伊家己。佇咧 Dylan 中,遮的方法會當共收集著叫做 ` to-string ` 的一个單一模組內底,毋過這个代碼予對這个自身的定義中徙掉。若是一个特定的物件無支援 ` to-string `,會當簡單的佇咧 ` to-string ` 模組中增加上伊。

擴充性

述的整體概念可能予讀者感覺足奇怪。處理一个窗仔口的 ` to-string ` 無定義佇咧 ` < window > ` 之中。除非考慮著講 Dylan 著 ` to-string ` 呼叫的處理方式,抑若無就可能會變做無意義。佇多數語言內底,佇咧程式的編譯的時陣,走揣予 ` < window > ` 的 ` to-string ` 並共替代為著這个方法的一个指標(抑是濟抑是少)。 佇咧 Dylan 中,這是發生佇程式初次咧執行的時陣,執行時系統建造一个方法名 / 形式參數細節的表格,並且通過這个表格來動態的走揣方法。這意味對一个特定的方法會當徛佇任何所在,毋但是編譯時間單元內底。最後編程者得著咧囥其代的碼頂頭的相當大的靈活性,只要若合,會使收集佇伊的類之中,嘛閣會當佮仝款的功能的方法來收集佇咧泛化函式內底。

遮隱含著編程者會當通過佇單獨檔案中定義函式,來向現存的類增加功能。譬如講人可能希望講向所有 ` < string > ` 增加拼寫檢查,這佇多數語言內底會需要存取著字串類的原始碼,這款基本類真少以原始寫碼形式共出。佇咧 Dylan(佮其他會使延伸語言)中,拼寫檢查方法會當增加到 ` spell-check ` 模組中,通過 ` define method ` 構造定義伊會當適用所有的類似。佇這个情形下,實際功能會當定義佇一个單一的泛化函式中,伊接受一个字串閣回錯誤。當 ` spell-check ` 模組去予人編譯入程式的時陣,所有的字捾(佮其他的物件)攏會得著這个增加的功能。

參照

外部連結

  • 官方網站 , Open Dylan–hosts open source , optimizing Dylan compiler targeting Unix / Linux , macOS , Microsoft Windows
  • Overview of the language
  • An Introduction to Dylan
  • Apple Dylan TR 一
  • The Marlais Dylan Interpreter–An implementation of a subset of Dylan , suitable for bootstrapping a compiler
  • 開放 kha-tá-lok-guh 專案中的「Dylan」