Falcon

Falcon程式語言，又稱Falcon P.L.、Falconpl或Falcon，是一個開源、多正規化程式語言，其設計和推廣由Giancarlo Niccolai領導。歷史.Haste於2002年編寫一個小型專案，用以實現一小型虛擬機器，該專案很快的發展成Falcon語言。2008年，此語言以開源專案的方式成為Ubuntu的附加軟體，並且被包含在Kross。核心.不同於關注於一個程式設計風格或正規化裡融合了幾種不同的風格。在實現級別上，Falcon是「服務概念」驅動，當不作為一個單一的工具被使用時指令碼引擎被看做一個服務指令碼，模組和內嵌的應用。Hello Falcon.儘管有各種形式的基本I/O，一個"hello world"例子使用"fast print"(快速列印):&gt; "Hello World!"Unicode支援，下面是一個國際化例子的介紹：// International class; name and streetclass 國際(なまえ, Straße)// set class name and street addressनाम = なまえشَارِع = Straße// Say who am I!function 言え!()&gt;@"I am $(self.नाम) from ",self.شَارِعendend// all the people of the world!民族 = [國際("高田 Friederich", "臺灣"),國際("Smith Σωκράτης", "Cantù"),國際("Stanisław Lec", "południow")]for garçon in 民族：garçon.言え!()正規化.Falcon融合六種"主流"程式設計正規化。過程式.程序式程式設計透過典型的函式宣告和呼叫被支援。每一個函式支援隱式變數引數呼叫和佔位引數。下面，一個完整的過程式程式，突出一部分在Falcon裡用來減少一些程式設計任務中固有的pre-body-post處理的困擾的設計理念function sayList( saying )for elem in saying» elemformiddle: » " "forlast: &gt; "!"endendsayList( List("Have", "a", "nice", "day") )函式式.Falcon有個稱為Sigma-reductor的求值引擎，它允許程式人員編寫純函式式程式，看起來和用Lisp沒什麼不同。混合式程式設計風格允許在函式式語句序列使用不同的正規化，或者在不同的過程化方式期間中使用函式式求值。函式式語句序列被描述為標準語言陣列；交叉不同的求值和在Sigma-reduction求值方式期間這都意味著語句序列能被程式本身建立，審查和被動態修改。下面的例子在列表迴圈呼叫"late binding"修改一個指定變數的引用。pnext = [ printl, '"', &amp;value, '"' ]dolist( function(p); seq.value = p; eval(seq); end,["Have", "a", "nice", "day"] )如果他們第一個成員變數是一個自身可呼叫元素，標準陣列作為函式被呼叫，如下面的例子。[printl "Prompt&gt; "]( "Real data to print" )同一個級別函式式語句序列能被作為儲存的呼叫來按照定義處理，並且一次性分配給一個變數，它們在語意上等同於一個函式符號。函式式正規化包含一個"out of band"元素標記。元素能接收一個透過語言運算子和函式被測試的"oob"特徵標記，並且當在函式式語句序列中移動時指明一個特殊含義的值。例如，很多函式式迴圈，如"floop"和"times"，能重新開始執行迴圈，或者被從包含的函式返回的無論"1"或"0"的out of band中斷。"map"函式透過一個對映函式轉換一個數組中的所有值，如果它是一個"nil"out of band將忽略返回值；透過這個方法可以在某處執行對映和過濾。面向物件.透過類，一個繼承模型，靜態類成員，屬性初始化和例項構造器，Falcon程式語言提供一個OOP正規化。在至多一個潛在的父類是被反射成原生資料的條件下支援多繼承。訪問基類成員被支援。例項的結構是固定和不變的，但是由於Falcon函式式特質，函式看上去就是一種特定種類的資料，它能動態設定例項成員為無格式資料或者函式。Falcon支援單一物件，可能是classless或者父類派生，在虛擬機器執行主指令碼之前例項化和被準備。在可能涉及程式模組中一個在其他的物件時，例項消除順序由Falcon連結器追蹤以確保單一物件的適當的初始化。透過函式式語句序列類例項能被建立，如例項化的一個類在語意上等於呼叫它的符號，因此，對一個第一個元素是一個類的函式式語句序列求值，它有建立一個例項的效果。Falcon的OOP模型完整支援運算子過載，它允許建立一個針對數學和邏輯的擁有指定的行為運算子的類。面向原型物件.原型OOP比OOP更簡單，但它去掉類的概念。例項全是classless，他們的結構能被動態改變。Falcon語言字典能包含函式，那時字典能被"祝福"，通知語言他們作為classless例項被處理，並且使用"點訪問符"使他們的值作為屬性或方法被處理。在下面的例子，一個字典變成一個物件：dict = bless([ 'state' =&gt; 0, 'incme' = &gt; function(); self.state++; end ])dict.incme()&gt; dict.state // will print '1'簡單地執行繫結的陣列。array = [1,2,3]array.showMe = function()for item in self&gt; itemendendarray.showMe()面向訊息.當一個訊息被廣播時面向訊息程式設計允許間接呼叫一個或者更多註冊的監聽器。訊息的內容是任意的並且能包含任何語言元素，包括但不限於哪個建立建立例項的類，函式序列或者表。監聽器不是完整接受訊息和執行他們，就是透過有次序的步驟分享在構建中的一個訊息的通用應答。訊息能被廣播和包含一個實時的應答或者能被儲存在環境用來接收和處理更多的後來者。面向訊息程式設計擁有一個在虛擬機器裡的直接介面，關於擴充套件原生模組和嵌入應用能相互作用。例如，一個多執行緒應用可能拋給虛擬機器來自不同的執行緒訊息，為了在指令碼級別上序列化處理和稍後廣播直接來自指令碼的處理解決方案。表格化.表格式程式設計能看做是一種OOP程式設計的特殊擴充套件，一個類透過一個表格被描述，他們的列是屬性，每一行是一個例項。不同於一起保持全部例項，允許每個例項影響父表周圍的行，關於表的修改被動態反射到每個例項。表格提供一個方法來在有限選擇的集合之間選擇行為，或者混合行為併合並它們，提供模糊邏輯引擎。如每一行，實質上的一個Falcon陣列，能包含表中資料和邏輯或者私有邏輯，在表格裡一個透過全域性選擇邏輯選擇的實體能提供專門的處理能力。特性.隨著多正規化程式設計，Falcon為程式設計人員呈現多種多樣的特色。模板檔案.透過預處理符號，Falcon允許指令碼成為文字文件的一部分，、。儲存為".ftd"的指令碼被作為一個文字檔案來處理並且在遇到其中一個預處理符號之前簡單輸出。下面的".ftd"例子裡包含其中的指令碼被執行：You called this script with  parameters.FTD檔案能透過標準Falcon指令碼被整合到各式應用，在動態模板中的是表現邏輯，應用邏輯被儲存在Falcon模組。FTD檔案能被用來驅動動態網站，一些流行的網頁伺服器，擁有直接分析和執行".fal"和".ftd"指令碼的模組，提供整合到網頁伺服器引擎的一個API。用CGI指令碼也能使用動態FTD頁面。異常.Falcon由"raise", "try"和"catch"語句支援錯誤處理。raise語句能丟擲任何Falcon元素，包括Nil，numbers, strings, objects等等。庫函式和擴充套件模組將通常引發錯誤類的例項，或者派生自他的例項。catch語句能捕獲任何型別的元素，一個某種型別:try... code that can raise ...catch TypeError in error... if we mixed up types ...catch Error in error... another generic error ...catch StringType in error... an explicit raise "something" was issued ...catch in error... no idea of what has been raised.endcatch語句中的"in"子句是可選的。"catch"語句模仿"select"語句，能被用一個給出的型別或者類轉向。可嵌入執行時.使用可連結執行時庫"libfalcon"，Falcon被設計成可嵌入和可擴充套件其他系統的。文件生成器.Falcon裝載著一個整合的文件系統，叫做"faldoc"，是特別設計來提供可維護的文件的Falcon基礎庫。虛擬檔案系統.所有發生在引擎或者虛擬機器讀取模組或者開啟資源，透過第三方模組且或透過嵌入引擎的應用程式可以包含特殊的虛擬位置的支援。併發支援.在更新到0.8.x版本，"Threading"模組提供指令碼完整多執行緒。執行緒模型是"面向代理。這允許有效的並行處理和在指令碼開發者控制之外的0競爭。協同處理.Falcon支援準併發協同處理。協同處理是指透過虛擬機器在同一時間片或者在空閒時間裡執行程式碼。它們支援一個接近於完整執行緒模組的更輕量級的併發處理，透過不同的協同處理允許程式的全域性資料完全可見。除了每個協同處理的合作，。元編譯器.Falcon"編譯器有一個支援宏展開的元編譯器，在一個標準編譯器中元編譯器由Falcon虛擬機器驅動；自元編譯器生成的輸出被髮送到語言的語法分析器就像他是原始程式碼的一部分。使用\[ ...\]"'退出序列，透過列印他能動態記錄被編譯的程式內容。\[ printl( "printl( 'Hello world' )" ) \]"macro"關鍵字提供一個簡單的轉到編譯時超程式設計的"語法糖果"介面。原生國際化.用一個字首'i'的字串被認為是一個輸出字串。在一個模組中透過使用"directive"語句宣告使用的語言，它能指示哪個字串用什麼自然語言編寫，如下面的例子：directive lang=fr_FR // uses 5 characters ISO language code&gt; i"Bonjour à tout le monde!"一個命令列工具"fallc"被用來輸出'i'字串到XML定義檔案，能被作為模板來支援翻譯到不同的語言。在讀取模組的時候一個已翻譯的字元表被應用到模組。特色.完整地支援模組化程式設計，Falcon裝載著"特色"模組當前包括：實現.核心VM和官方模組，都是用C++編寫.一些非常底層的模組和引擎元素是用C和彙編編寫。可用資源.在Mac OS X和MS-Windows系統上Falcon透過安裝程式釋出，構建和安裝是一個清晰的過程，或者在各種開源系統如Linux或OpenSolaris上透過自構建原始碼包。在後者系統上，"Falcon程式語言"通常支援各種發行版本並保持更新的，其中有：在基於Solaris系統的發行版本上透過Blastwave專案和OpenSolaris系統的 [AuroraUX http://en.wikipedia.org/wiki/AuroraUX] 發行版本Falcon程式語言是可用的。