我是标准ML的新手,我正试图了解SML / NJ运行时环境。我想根据我的需要调整它。具体来说,我想:
这是我在8个多小时的阅读文档和实验中发现的。
我可以使用命令
在int上重载IntInfopen IntInf;
我可以使用变量Control.Print.stringDepth控制字符串中显示的字符数。例如,这将允许它在截断之前显示1000个字符:
Control.Print.stringDepth := 1000;
我如何为IntInf值做同样的事情?我可以将深度设置为无限(即根本没有截断)吗?
打开IntInf是使用IntInf重载int的最佳方法吗?
最后,如何在运行时自动加载所有内容,以便在调用“sml”时它在我的默认环境中?
编辑:我发现有一个名为Control.Print.intinfDepth的选项可以设置为一个大数字(例如,999999)。不过,我不知道如何让它变得无限。
我的其他问题仍然没有答案。
编辑:我遇到了这个set of SML/NJ customizations for a class at Kansas State。要显示我自己的横幅消息并避免显示“val it = true:bool”,我需要测试SMLofNJ.exportML的返回值。如果是真的,堆映像刚刚恢复(即启动),我可以显示一条消息。如果它是假的,那么堆图像就被保存了。
答案 0 :(得分:3)
如何在运行时自动加载所有内容,以便在调用“sml”时它在我的默认环境中?
您需要创建一个堆映像以由sml
脚本运行,然后您可以将其符号链接到该脚本。为了避免引导的复杂化,我通常给我的堆图像一个不同的名称;例如; sml-nw
代表SML / NJ,支持noweb。
创建堆映像所需的基本原语是SMLofNJ.exportML
。以下是您使用它的方式:
按照您希望的方式设置所有内容,例如open IntInf
并设置所有Control.Print
个变量。 (你可以尝试设置Control.Print things to
valOf Int.maxInt`,这是最接近无穷大的东西。)
按SMLofNJ.exportML "mysml"
创建新的堆图像。当您启动自定义版本时,您将在调用exportML
后立即开始。阅读the documentation。玩耍;有很多方法可以使用这个原语。
将堆映像(可能是mysml.x86-linux
)复制到堆映像的安装目录(在我的安装/usr/lib/smlnj/bin/.heap
上),但是您可以在sml
脚本中跟踪线索确定)
创建一个脚本mysml
,它是sml
脚本的符号链接。
在过去,这已经足够了,但我已经好几年没有使用过SML / NJ了。我还在网上找到了somewhat outdated example。
答案 1 :(得分:0)