UStackUStack
Franz icon

Franz

Franz 是一種功能導向、以原型為核心的程式語言,具有精簡語法與詞法作用域,支援透過 LLVM IR 進行原生編譯。

Franz

Franz 是什麼?

Franz 是一種高階、函數式、直譯、動態型別的通用程式語言,語法精簡且標準函式庫豐富。其核心目的是支援函數式程式設計模式,同時提供管理效應與可預測執行的工具。

本專案被定位為以原型為核心的語言,具備能力安全效應與確定性重播功能,並包含「嚴格無副作用」(但明確註明 IO 例外)。此外,也提供從原始碼透過 LLVM IR 編譯至原生執行檔的途徑。

主要特色

  • 函數式核心搭配原型導向物件:以小型函數式基礎加上原型導向物件來模擬行為,同時保持語言以函數式建構為中心。
  • 能力安全效應與確定性重播:設計用來協助將來自匯入 Franz 檔案的效應進行本地化與控制。
  • 嚴格無副作用(IO 表格例外):語言模型被描述為避免副作用,但明確提及 IO 機制作為例外。
  • 透過 LLVM IR 進行原生編譯:支援使用 LLVM IR 直接編譯成原生執行檔。
  • 清單字面量與 LLVM 清單操作:包含清單字面量語法,例如 [1, "hello", 3.14] 與巢狀清單,以及 headtailconsempty?lengthnthis_list 等操作。
  • 常見型別的比較與數學基本運算:提供適用於整數、浮點數與字串的相等/排序運算子(isless_thangreater_than),以及 remainderpowerrandomfloorceilroundabsminmaxsqrt 等數學函數。
  • 控制流程與模式式條件判斷:提供 if/when/unless 建構以及用於模式匹配式多路分支的「cond chains」。
  • 詞法作用域與快照式閉包:實作詞法作用域,閉包會從定義時的環境擷取變數;支援任意深度的巢狀閉包。
  • 匯入程式碼的能力式沙箱:透過 use_with() 實作沙箱執行模式,並使用 use_as() 與點記法進行效應本地化(詳見儲存庫說明)。

如何使用 Franz

  1. 複製或開啟 Franz 儲存庫,並檢視內附的 README.md 與範例檔案(例如 examples/mult-table.franzexamples/game-of-life.franz)。
  2. 檢視文件中所提及的標準函式庫模組(String、Math、List、Func),以了解可用的內建函數與清單/清單組合子操作。
  3. 依照儲存庫說明中的詞法作用域與閉包模式,驗證閉包如何擷取變數以及巢狀閉包的行為。
  4. 執行儲存庫提供的腳本來測試實作與煙霧測試(儲存庫提及的 bash 腳本,例如 scripts/run-comparison.sh 與自動化煙霧測試)。

使用情境

  • 建置使用函數式清單處理的資料轉換程式碼:使用清單字面量與清單操作(例如儲存庫說明中所示的 map-style 模式,以及 head/tail/nth 等清單輔助函數)來處理結構化資料。
  • 實作多分支邏輯與條件鏈:當需要根據整數/浮點數/字串比較或守衛來路由邏輯時,使用 cond 鏈進行模式式分支。
  • 撰寫使用閉包的高階程式碼:使用「Func module」組合子(例如 compose2applyapply_twice)與快照式閉包來建置可重複使用的函數式元件。
  • 展示小程式中的可預測作用域:使用詞法作用域與任意深度的巢狀閉包來建構程式,使擷取的變數在呼叫間保持穩定。
  • 使用原生編譯來原型化語言行為:透過 LLVM IR 管道將 Franz 程式碼編譯成原生執行檔,包含使用清單操作、數學運算、比較與控制流程的程式碼路徑。

常見問題

  • Franz 是否無副作用? 儲存庫說明指出「嚴格無副作用」,但明確註明 IO 表格作為例外。

  • Franz 是否可編譯成原生執行檔? 是。本專案說明指出「透過 LLVM IR 直接編譯成原生執行檔」。

  • Franz 使用什麼型別模型? Franz 被描述為動態型別且具垃圾收集。

  • Franz 中的閉包擷取如何運作? 文件描述詞法作用域,其中閉包會從定義時的環境擷取變數(快照式閉包),並支援任意深度的巢狀閉包。

  • 儲存庫包含哪些工具? 儲存庫包含 examples/ 下的範例、測試(包括「煙霧測試」),以及執行比較與檢查的腳本(詳見頁面內容)。

替代方案

  • 具備強型別系統的功能式程式語言(例如 ML 家族語言):若您主要想要功能式語法、可預測的作用域與閉包,但不以 LLVM 原生編譯為重點。
  • 以原型為基礎的語言(例如使用功能模式的 JavaScript):適合您對原型導向物件建模感興趣,但 Franz 所述的工作流程與效應模型有所不同。
  • 具備功能特性的通用編譯語言(例如透過 LLVM 編譯的語言):若您想要 LLVM IR 編譯與功能建構,但偏好不同語法與執行環境的生態系。
  • 用於原型設計的腳本語言搭配沙箱機制:若您優先考量快速實驗與受控執行(本儲存庫討論基於能力的安全性模式),可選擇其他提供自身沙箱機制的執行環境。