我成功地在我的 MAC OS 10.14 Mojave 上安装了 smlnj。它在终端中运行良好。然后,我在 emacs 中安装 sml 包时遇到了麻烦。当我在 .sml 文件中输入内容时,颜色和缩进都是正确的。但是,当我执行 Cc Cs 并按 Enter 时,它显示“sml:无法确定架构/操作系统”,因此我无法在此缓冲区中执行任何操作,例如类型 1+1;或其他任何东西。有没有关于如何解决这个问题的提示?我整天都被困在这里。提前致谢!
1 回答
这似乎是 SML/NJ 的运行时系统中的一个问题:
我只有 110.77 的源代码,我不知道您正在运行什么版本的 SML/NJ,但这是我如何完成调试过程以及之后您可以做什么:
$ ack "unable to determine arch" smlnj
config/_heap2exec
24: die "unable to determine architecture/operating system"
config/_link-sml
47: echo "$CMD: unable to determine architecture/operating system"
config/_run-sml
62: echo "$CMD: unable to determine architecture/operating system"
也许 Emacs 没有为 SML/NJ 的二进制文件导出正确的环境变量来正确检测操作系统。深入config/_run-sml
研究,这看起来像导致错误消息的代码:
ARCH_N_OPSYS=`"$BIN_DIR/.arch-n-opsys"`
if [ "$?" != "0" ]; then
echo "$CMD: unable to determine architecture/operating system"
exit 1
fi
eval $ARCH_N_OPSYS
里面config/_arch-n-opsys
有一个 MacOS 的 switch 语句:
Darwin)
case `uname -p` in
powerpc)
ARCH=ppc
case `uname -r` in
9*) OPSYS=darwin; HEAP_OPSYS=darwin ;; # MacOS X 10.5 Leopard
*) exit 1;;
esac;;
i386) ARCH=x86;
case `uname -r` in
9*) OPSYS=darwin; HEAP_OPSYS=darwin ;; # MacOS X 10.5 Leopard
10*) OPSYS=darwin; HEAP_OPSYS=darwin ;; # MacOS X 10.6 Snow Leopard
11*) OPSYS=darwin; HEAP_OPSYS=darwin ;; # MacOS X 10.7 Lion
12*) OPSYS=darwin; HEAP_OPSYS=darwin ;; # MacOS X 10.8 Mountain Lion
13*) OPSYS=darwin; HEAP_OPSYS=darwin ;; # MacOS X 10.9 Mavericks
14*) OPSYS=darwin; HEAP_OPSYS=darwin ;; # MacOS X 10.10 Yosemite
*) exit 1;;
esac;;
shell 脚本.arch-n-opsys
是确定您正在使用的操作系统的脚本。因此,SML/NJ 110.77 的运行时系统似乎没有检测到 MacOS 超过 10.10。为什么这不是 Emacs 之外的问题,我不确定。
您可以尝试通过在 Emacs 中运行该程序,M-x shell
RET然后键入:
cd /usr/lib/smlnj/bin
ls -a
./.arch-n-opsys
我怀疑如果你.arch-n-opsys
用一个小的 shell 脚本替换这个二进制文件,你可以在本地解决这个问题,这个脚本对你的首选选项进行硬编码,这可能是:
#!/bin/sh
echo "ARCH=darwin; OPSYS=darwin; HEAP_SUFFIX=darwin-darwin"
如果这不起作用,那么原始.arch-n-opsys
shell 脚本列出的其他一些选项可能会起作用。
仅当您有兴趣为他人解决问题时:
查看最新版本110.85是否支持 MacOS > 10.10。
如果没有,请写信到smlnj.org 底部的电子邮件并链接到此 StackOverflow 帖子,并说明
uname -r
您的系统上做了什么,或者提供一个特别适用于您的系统的差异。