如何自定义SML / NJ交互式循环?

时间:2009-04-11 22:33:39

标签: sml smlnj

我是标准ML的新手,我正试图了解SML / NJ运行时环境。我想根据我的需要调整它。具体来说,我想:

  • 默认情况下使用IntInf
  • 防止它将字符串和IntInf截断为70个字符。

这是我在8个多小时的阅读文档和实验中发现的。

我可以使用命令

在int上重载IntInf
open 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的返回值。如果是真的,堆映像刚刚恢复(即启动),我可以显示一条消息。如果它是假的,那么堆图像就被保存了。

2 个答案:

答案 0 :(得分:3)

  

如何在运行时自动加载所有内容,以便在调用“sml”时它在我的默认环境中?

您需要创建一个堆映像以由sml脚本运行,然后您可以将其符号链接到该脚本。为了避免引导的复杂化,我通常给我的堆图像一个不同的名称;例如; sml-nw代表SML / NJ,支持noweb

创建堆映像所需的基本原语是SMLofNJ.exportML。以下是您使用它的方式:

  1. 按照您希望的方式设置所有内容,例如open IntInf并设置所有Control.Print个变量。 (你可以尝试设置Control.Print things to valOf Int.maxInt`,这是最接近无穷大的东西。)

  2. SMLofNJ.exportML "mysml"创建新的堆图像。当您启动自定义版本时,您将在调用exportML后立即开始。阅读the documentation。玩耍;有很多方法可以使用这个原语。

  3. 将堆映像(可能是mysml.x86-linux)复制到堆映像的安装目录(在我的安装/usr/lib/smlnj/bin/.heap上),但是您可以在sml脚本中跟踪线索确定)

  4. 创建一个脚本mysml,它是sml脚本的符号链接。

  5. 在过去,这已经足够了,但我已经好几年没有使用过SML / NJ了。我还在网上找到了somewhat outdated example

答案 1 :(得分:0)