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 链”。
  • 词法作用域与基于快照的闭包:实现词法作用域,闭包捕获定义时环境中的变量;支持任意深度的嵌套闭包。
  • 针对导入代码的能力型沙箱:通过 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 式模式,以及 head/tail/nth 等列表辅助函数)来处理结构化数据。
  • 使用条件链实现多分支逻辑:当需要根据整数/浮点数/字符串比较或守卫路由逻辑时,使用 cond 链进行模式式分支。
  • 使用闭包编写高阶代码:将“Func 模块”组合子(如 compose2applyapply_twice)与基于快照的闭包一起使用,构建可重复使用的函数式组件。
  • 在小型程序中演示可预测的作用域:使用词法作用域和任意深度的嵌套闭包,构建捕获变量在调用间保持稳定的程序。
  • 通过原生编译原型化语言行为:通过 LLVM IR 管道编译 Franz 代码,生成原生可执行文件,包括执行列表操作、数学、比较和控制流代码路径。

常见问题

  • Franz 是否无副作用? 仓库文本称“严格无副作用”,并明确注明 IO 表作为例外。

  • Franz 是否编译为原生可执行文件? 是。该项目描述称“通过 LLVM IR 直接编译为原生可执行文件”。

  • Franz 使用什么类型模型? Franz 被描述为动态类型并支持垃圾回收。

  • Franz 中的闭包捕获如何工作? 文档描述了词法作用域,其中闭包捕获定义时环境中的变量(基于快照的闭包),并支持任意深度的嵌套闭包。

  • 仓库中包含哪些工具? 仓库包含 examples/ 下的示例、“冒烟测试”测试,以及用于运行比较和检查的脚本(详见页面内容)。

备选方案

  • 具有强类型系统的函数式编程语言(例如 ML 系列语言):如果您主要需要函数式语法、可靠的作用域和闭包,但不将基于 LLVM 的本地编译作为重点。
  • 基于原型的语言(例如采用函数式模式的 JavaScript):当您关注原型导向的对象建模时适用,但 Franz 所述的工作流和效应模型有所不同。
  • 具有函数式特性的通用编译型语言(例如通过 LLVM 编译的语言):如果您需要 LLVM IR 编译和函数式构造,但希望采用不同语法和运行时约定的生态系统。
  • 用于原型设计的脚本语言(采用沙箱机制):如果您优先考虑快速实验和受控执行(仓库中讨论了基于能力的安全模式),可以选择提供自身沙箱机制的其他运行时。