SML/NJ 未在 Mac 上自动加载 Basis 库

SML/NJ not autoloading Basis library on Mac

当我尝试使用函数 List.nth 时,sml shell returns 此错误消息:

- 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

如果我在没有 List. 的情况下使用 nth,它 returns 同样的错误消息。 所以我可以猜测 'autoloading' 库有问题。

但是还有一些奇怪的事情。 如果我使用另一个基础库函数 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

看来 'autoloading' 肯定有问题,但我不知道如何解决。 请帮我找到问题并解决它!

注:

  1. 我使用 Max OS X 10.13.3,和 SML/NJ v110.81 的编译器
  2. 路径中的
  3. 'jhr'就是前面的'user name'。我改为'cadenzah'。这就是为什么这条路不存在的原因。 'Users'目录下有'cadenzah'目录。

ps。也许以前版本和这个(v110.81)之间编译器本身的目录结构有问题?

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

编译器似乎位于 user-owned 目录中;我建议您按照 this blog post 的指示尝试通过 Homebrew 安装 SML/NJ:

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

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

  • SML not detecting OS on OS X Mavericks
  • How do I install a working version of Standard ML on Mac?

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

否则,请尝试将当前用户名设置为 'Cadenzah' 而不是 'cadenzah',以便它与您的用户目录的大小写匹配。 Unix 文件系统往往区分大小写。尽管 MacOS 不是,但默认情况下,这可能会在不遵守本地文件系统法律的软件中引起一些冲突。

如果您遇到此问题,使用自制软件安装无法解决,请尝试将环境变量SMLHOME_DIR设置为安装目录。这可能会解决一些 "File not found" 错误。

示例:

% 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

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

执行:

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

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

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