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' 肯定有问题,但我不知道如何解决。
请帮我找到问题并解决它!
注:
- 我使用 Max OS X 10.13.3,和 SML/NJ v110.81 的编译器
路径中的- '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
当我尝试使用函数 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' 肯定有问题,但我不知道如何解决。 请帮我找到问题并解决它!
注:
- 我使用 Max OS X 10.13.3,和 SML/NJ v110.81 的编译器 路径中的
- '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