FORA/教程
FORA教程是使用FORA程式語言的實用指南。它透過使用示例來演示一些簡單程式的開發,從而教會讀者。每個示例都引入了新的功能,因此,透過掌握這些示例,一位稱職的技術人員將準備好應對更高階的專案。
假設讀者具有邏輯思維能力和基本的數字能力。熟悉C、Python或Java等語言將有所幫助,因為FORA與這些語言類似。理解面向物件程式設計很有用,但不是必需的。示例以簡潔的自文件程式設計風格編寫,易於理解。避免使用程式設計“技巧”,因為結果通常會導致難以維護的程式碼。
FORA提供了一個平臺來開發程式,這些程式可以動態擴充套件以使用所有可用的計算機資源來執行復雜的計算。如果您擁有一個32核的CPU,那麼FORA程式將動態地使用盡可能多的核心來最小化其執行時間。類似地,在雲環境中,計算可以在多臺刀片計算機之間分配。因此,與等效的C程式相比,使用FORA程式碼可以更快地解決許多問題。
FORA直譯器動態編譯程式碼,因此執行效率與用C編寫的程式類似,但使用直譯器進行開發比使用編譯器快得多。因此,FORA允許比傳統語言更快地開發和修改數學模型。
FORA程式是一系列FORA語句,通常儲存在硬碟上。程式可以引用庫中的FORA模組。通常,程式開發為一組模組。每個模組都以互動方式進行測試,然後作為模組安裝到庫中。標準FORA虛擬機器有兩個文字編輯器,適合編寫FORA程式碼
- "gedit"是一個基於螢幕的編輯器,可從“應用程式/附件”選單中獲得。
- 可以使用同一選單中的終端訪問舊版“vi”編輯器。
作者更喜歡使用“vi”。
識別符號名稱遵循標準的程式設計約定。示例使用“駝峰式命名法”風格,使程式碼更易於理解。在FORA中,所有識別符號都是物件,它們在使用時會被動態型別化。內建函式提供字串和基本整數型別之間的強制轉換。下表說明了它是如何工作的。
| 程式碼 | 動態物件型別 | 強制轉換函式 |
|---|---|---|
| a=1 | Int64(帶符號64位整數) | a=Int64("123") |
| a=1s32 | Int32 | a=Int32("123") |
| a=1s16 | Int16 | a=Int16("123") |
| a=1s8 | Int8 | a=Int8("123") |
| a=1u64 | Uint64(無符號) | |
| a=1u32 | Uint32 | |
| a=1u16 | Uint16 | |
| a=1u8 | Uint8 | |
| a=true | Uint1 | |
| a="Hello" | String | a=String(123) |
| a=1.0 | Float64 | |
| a=1.0f32 | Float32 | |
| a=1.0; a=1 | 最終Int64 | |
| a=fun(x){x*x} | 函式 | |
| a=(1,2) | Tuple(Int64,Int64) | |
| a=(1,'Fred') | Tuple(Int64,String) | |
| a=[1,2,3] | Vector(Int64) | |
| a=[1,'Fred'] | Vector(AnyConstant) | |
| a=['Fred'] | Vector(String) |
FORA“型別”解釋命令返回任何作用域內FORA物件的型別。
FORA在支援它的硬體上預設使用64位整數。在許多系統中,64位算術比32位計算慢。在最佳化模組程式碼時,使用適當的整數大小通常會帶來效能優勢。
FORA支援以下運算子
| 運算子類別 | 支援的運算子 |
|---|---|
| 算術 | +,-,*,/,%,** |
| 比較 | ==,!=,>,<,>=,<= |
| 連線 | + |
| 賦值 | = |
| 按位 | ,^,<<,>> |
| 邏輯 | and,or,not |
| 優先順序 | (,) 作為匹配對 |
| 塊 | {,} 作為匹配對 |
運算子含義和優先順序遵循行業標準。

在標準FORA VM上,從“應用程式/附件”選單開啟一個終端視窗。
然後輸入“fora”載入直譯器。
您現在可以輸入您的第一行FORA程式碼作為“println("Hello World")”。FORA內建函式print和println提供基本的控制檯輸出,主要用於程式測試。
您已經編寫並測試了您的第一行FORA程式碼,並且應該看到類似於影像的結果
使用您喜歡的文字編輯器建立檔案hello.fs作為hello程式的原始檔。它應該包含FORA語句“println("Hello World")”。然後將檔案儲存到磁碟。

在另一個終端視窗中輸入“fora hello.fs”。
您的第一個FORA程式已執行,您應該看到類似於影像的結果

本教程從hello.fs開發greet.fs,並使用一個簡單的函式來個性化我們的程式。
使用您喜歡的文字編輯器,根據影像程式碼建立greet.fs。

開啟另一個終端視窗,並在互動模式下執行FORA直譯器以測試greet函式。
它工作正常,因此按Control-D退出FORA直譯器。
您現在有一個包含原始碼的視窗和一個使用FORA直譯器的視窗。更改您的原始碼以使用澳大利亞的“G'day”,而不是英文的“Hello”。現在點擊向上箭頭鍵,它會顯示最後一個命令。按Enter鍵測試您的程式碼更改。您擁有一個簡單有效的測試環境。

現在 greet 函式已經過測試,我們可以將其包含在一個經過測試的例程庫中。預設情況下,FORA 會在當前目錄中搜索副檔名為 .fora 的模組庫。我們將把我們的庫命名為 tutorial.fora,並在當前目錄中建立此檔案 (mkdir tutorial.fora)。
我們將 greet.fs 複製到庫中,並將函式宣告更改為適合模組函式,並進行相應的文件說明。

現在,我們使用不同的 FORA 選項從模組庫執行 greet 函式。首先,我們使用 -e 選項來評估表示式;在本例中為函式呼叫語句。然後,我們使用不帶任何選項的互動方式執行直譯器。最後,我們使用 -i 選項執行 FORA 原始檔 base.fs(如下所示)並互動式地測試模組。按 Control-D 退出。

此程式展示了一個簡化編碼和節省輸入的巧妙技巧。
迭代器和迭代器函式是 FORA 語言的一個非常強大的功能。本教程使用一個簡單的示例來展示如何使用這些功能。
迭代器函式被重複呼叫以返回值,直到它完成。潛在地,函式可能永遠不會結束,因此它可以被視為當前值和由尚未返回的值組成的尾部。返回值是迭代器。迭代器通常與以下結構一起使用
for 迭代器 in 迭代器函式 { 函式 }

首先,我們編寫一個迭代器函式 sequence(start,end) 以返回範圍 start 到 end 中的所有整數。預設情況下,範圍為 1 到 5。我們建立了一個名為 seq.fora 的檔案,如下所示,並將其儲存到磁碟。
yield 語句將迭代器返回給呼叫方。

我們載入 FORA 直譯器並使用 "for 迭代器 in 迭代器函式" 結構來測試我們的程式碼。
現在程式碼已經過測試,我們將其新增到 tutorial.fora 中。將來,它將被訪問為 tutorial.sequence,並且檔案 seq.fora 應該被刪除。

現在,我們將 sequence 程式修改為從檔案中讀取行。readFile 迭代器函式將檔名作為引數。該函式直接使用 Python 檔案訪問原語,以及區域性變數。建立一個包含所示程式碼的檔案 rd.fora。
我們解釋新功能。
- 在函式內部,let 指令將識別符號繫結到其儲存位置,並且必須在第一次引用識別符號時使用。
- Python 的 open 函式將檔案連結到 PythonObject。使用 'rb' 或 'wb' 進行讀取或寫入。
- size 函式返回字串中的字元數。
- Python 的 readline 函式讀取下一行文字(包括換行符)來自連結到檔案的 PythonObject。在檔案末尾,將返回一個零長度字串。

由於測試程式是非平凡的,因此我們建立了一個檔案 rdTest.fs 並使用 FORA 互動式地測試該函式。
我們解釋測試程式。
- 檔名是硬編碼的,因此我們不必在每次測試時都輸入它。列出此簡短測試程式的原始碼就足夠了。請注意,由於此程式碼以互動方式執行並且不是函式,因此不應使用 let 指令。
- 列印標題行並初始化行計數。
- 呼叫迭代器函式以返回檔案中的每一行。每一行都按如下方式處理。
- 列印行號以及行內容。請注意,由於每一行都以 EOL 字元結尾,因此使用 print 而不是 println。
- 最後,println 整潔地完成列表。

請注意,我們使用 '-i' 編譯器選項以互動方式執行 FORA 直譯器。
作為一項技術練習,更改 rdTest.fs 以將行號列印為一個零填充的 3 位數字欄位。提示:需要替換第 5 行。
現在 readFile 函式已經過測試,可以將其作為經過測試的函式新增到模組 tutorial.fora 中。然後應該刪除 rd.fora。