mGTK 是什么?它为 SML 程序员提供了什么?

更新时间

mGTK 是一套让 GTK+ 图形界面库可以从 SML(Standard ML)中调用的“胶水代码”绑定库,目的是让 SML 程序员能用熟悉的语言开发可视化桌面应用。它适合仍在使用 Moscow ML 编译器、并且希望在 Linux 或 Windows 上构建 GTK+ 界面的开发者;如果你用的是其他 SML 编译器,或需要活跃维护的现代 GUI 方案,它并不合适。

它解决什么问题

SML 本身没有官方 GUI 工具包,而 GTK+ 是成熟的跨平台界面库。mGTK 在两者之间做绑定,把 GTK+ 的窗口、按钮、容器、信号等概念映射成 SML 可调用的接口。按项目页面的说法,它“为 SML 程序员提供开发可视化应用的便捷接口”。

支持范围与限制

维度 情况
支持的编译器 Moscow ML(主要支持);MLton 支持在后期预发布版中加入
可运行平台 同时被 Moscow ML 和 GTK+ 支持的平台;已知可在 Linux 和 Windows 上运行
许可证 当前为 LGPL,项目方表示未来可能改为限制更少的许可证
项目状态 页面最后修改于 2001 年,最新版本为 2004 年的预发布版,属于早期实验性项目

典型程序结构

项目页面给出了一个 Hello World 示例,能直观看出 mGTK 程序的骨架:初始化 GTK、创建窗口和控件、连接信号、把控件加入容器、显示并进入主循环。

fun hello _ = print "Hello World\n"

fun main () =
  let
    val _ = GtkBasis.init(CommandLine.name()::CommandLine.arguments())
    val window = Window.new Window.TOPLEVEL
    val button = Button.new_with_label "Hello World"
  in
    Signal.connect window (Widget.delete_event_sig (fn _ => false));
    Signal.connect window (Widget.destroy_event_sig
      (fn _ => (GtkBasis.main_quit(); true)));
    Signal.connect button (Button.clicked_sig hello);
    Container.add window button;
    Widget.show_all window;
    GtkBasis.main()
  end

这段代码对应几个关键机制:

  • 初始化:GtkBasis.init 接收命令行参数,启动 GTK 运行时。
  • 信号连接:按钮点击绑定到 hello 函数;窗口关闭事件绑定到退出主循环,这是 GTK 事件驱动模型的标准写法。
  • 容器与显示:控件必须先加入容器,再调用 show_all 才会可见。
  • 主循环:GtkBasis.main() 接管事件循环,程序在此等待用户操作。

版本与获取方式

项目托管在 SourceForge,下载页列出了各版本:

  • mgtk-pre-0.92(2004 年 7 月 12 日):首个主要里程碑的预发布版,加入 MLton 支持。
  • mgtk-pre-0.90(2004 年 6 月)。
  • mgtk-beta-0.03(2001 年 5 月 7 日)。
  • mgtk-beta-0.02(2000 年 6 月 16 日),附 Windows 二进制。
  • mgtk-alpha-0.01(2000 年 4 月 28 日)。

项目方明确说明这些是预发布版本,“没有提供太多指导”,遇到问题需要直接联系作者。另有低流量、审核制的邮件列表 mgtk-announce,仅用于发布新版本公告。

是否值得选用

适合的情况:你在维护或研究 Moscow ML 上的 SML 图形程序,需要参考 GTK+ 绑定的实现方式,或者想了解早期 SML GUI 生态。

需要谨慎的情况:项目页面信息停留在 2004 年,文档稀少,只支持特定编译器组合。若你要开发新项目,应先确认 Moscow ML 与 GTK+ 的版本兼容性,并预期需要自行阅读 README 和源码排错。许可证虽为 LGPL,但项目方保留了未来调整的权利,涉及分发时应以实际发布文件中的许可声明为准。