3

我是标准 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)。不过,我不知道如何使它无限。

我的其他问题仍未得到解答。


编辑:我在 Kansas State 的一个班级遇到了这组 SML/NJ 定制。为了显示我自己的横幅消息并避免显示“val it = true : bool”,我需要测试 SMLofNJ.exportML 的返回值。如果是真的,堆映像刚刚恢复(即启动),我可以显示一条消息。如果为 false,则只是保存了堆映像。

4

2 回答 2

3

如何使这一切在运行时自动加载,以便当我调用“sml”时它在我的默认环境中?

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

创建堆映像所需的基本原语是SMLofNJ.exportML. 以下是你如何使用它:

  1. 以您想要的方式设置所有内容,例如,open IntInf设置所有Control.Print变量。(您可以尝试设置 Control.Print things tovalOf Int.maxInt`,这是最接近无穷大的东西。)

  2. 通过 .创建一个新的堆映像SMLofNJ.exportML "mysml"。当您启动自定义版本时,您将在调用exportML. 阅读 文档。到处玩;有很多方法可以使用这个原语。

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

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

在过去,这已经足够了,但我已经好几年没有使用 SML/NJ 了。我还在网上找到了一个有点过时的例子

于 2009-05-02T16:57:38.770 回答
0

这有帮助吗?

http://archives.devshed.com/forums/programming-132/big-integers-in-sml-nj-97t-316791.html

不确定无限的问题。

于 2009-04-13T09:31:16.473 回答