SML / NJ不能自动加载Mac上的Basis库

时间:2018-03-19 04:11:10

标签: sml smlnj

当我尝试使用函数List.nth时,sml shell会返回以下错误消息:

- List.nth([1,2,3],0);
[autoloading]

unexpected exception (bug?) in SML/NJ: Io [Io: openIn failed on "/Users/jhr/Work/smlnj/osx-dist/smlnj.dst/sml.boot.x86-unix/smlnj/basis/.cm/x86-unix/basis.cm", No such file or directory]
raised at: Basis/Implementation/IO/bin-io-fn.sml:617.25-617.71
         ../cm/util/safeio.sml:30.11
         ../compiler/TopLevel/interact/evalloop.sml:42.54

如果我使用nth而不使用List.,则会返回相同的错误消息。 所以我可以猜测自动加载'是否存在问题。图书馆。

但是还有一些奇怪的事情。 如果我使用另一个基础库函数length,它可以正常工作。像这样:

- length ([1,2,3]);
val it = 3 : int

但是如果我使用List.length怎么办?它会出错。像这样:

- List.length([1,2,3]);
[autoloading]

unexpected exception (bug?) in SML/NJ: Io [Io: openIn failed on "/Users/jhr/Work/smlnj/osx-dist/smlnj.dst/sml.boot.x86-unix/smlnj/basis/.cm/x86-unix/basis.cm", No such file or directory]
 raised at: Basis/Implementation/IO/bin-io-fn.sml:617.25-617.71
         ../cm/util/safeio.sml:30.11
         ../compiler/TopLevel/interact/evalloop.sml:42.54

因此,自动加载'东西,但我无法弄清楚如何解决它。 请帮我找到问题并修理它!

注意:

  1. 我使用Max OS X 10.13.3和v110.81
  2. 的SML / NJ编译器
  3. ' JHR'在路径中是以前的用户名'。我改为' cadenzah'。这就是为什么这条路不存在的原因。有一个' cadenzah'目录在'用户'目录。
  4. PS。也许在先前版本和此版本(v110.81)之间编译器本身的目录结构存在问题?

3 个答案:

答案 0 :(得分:1)

你是如何在Mac上安装SML / NJ的?

编译器似乎驻留在用户拥有的目录中;我建议您尝试通过Homebrew安装SML / NJ作为this blog post指示:

$ ruby <(curl -fsSk https://raw.github.com/mxcl/homebrew/go)
$ brew update
$ brew install smlnj

由于您并未询问如何安装SML / NJ,因此这不是以下问题的重复:

但也许你应该问这个问题而不是这个问题。 :)

否则,请尝试将当前用户名设置为&#39; Cadenzah&#39;而不是&#39; cadenzah&#39;所以它匹配您的用户目录的大小写。 Unix文件系统往往区分大小写。

答案 1 :(得分:0)

如果遇到此问题,但无法通过使用自制程序来解决,请尝试将环境变量SMLHOME_DIR设置为安装目录。这样可以解决一些“找不到文件”错误。

示例:

% pwd
/usr/local/smlnj
% ls
MLRISC/  bin/   cml/     doc/  ml-burg/  ml-lpt/   nlffi/  smlnj-lib/            license.html
base/    ckit/  config/  lib/  ml-lex/   ml-yacc/  null    trace-debug-profile/
% export SMLNJ_HOME=/usr/local/smlnj/

然后可以将其添加到.zshrc等中。

答案 2 :(得分:0)

我通过导出 SML 的 MacOS 安装文档中提到的 SMLNJ_HOME 解决了同样的问题。

执行:

echo 'export SMLNJ_HOME="/usr/local/smlnj"' >> $HOME/.bash_profile

然后,将其输入到您当前的命令行环境中:

source $HOME/.bash_profile

然后 SML 能够从核心库加载额外的函数:

Standard ML of New Jersey v110.79 [built: Sun Oct  4 14:45:06 2015]
- List.nth;
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[library $SMLNJ-BASIS/(basis.cm):basis-common.cm is stable]
[autoloading done]
val it = fn : 'a list * int -> 'a