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,但项目方保留了未来调整的权利,涉及分发时应以实际发布文件中的许可声明为准。