sml:无法确定 emacs 中的操作系统,但在终端中工作正常

sml: unable to determine operating system in emacs but works fine in terminal

我在 MAC OS 10.14 Mojave 上成功安装了 smlnj。它在终端中工作得很好。然后,我遇到了在 emacs 中安装 sml 包的麻烦。当我在 .sml 文件中键入内容时,颜色和缩进都是正确的。但是,当我执行 C-c C-s 并按回车键时,它显示 "sml: unable to determine architecture/operating system," 因此我无法在此缓冲区中执行任何操作,例如键入 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 的 运行 时间系统没有检测到 10.10 之后的 MacOS。为什么这不是 Emacs 之外的问题我不确定。

您可以通过 M-x shell RET 在 Emacs 中尝试 运行 程序并键入:

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 脚本列表中的一些其他选项会起作用。


仅当您有兴趣为其他人解决问题时:

  1. 查看最新版本 110.85 是否支持 MacOS > 10.10。

  2. 如果没有,请写信给 the email at the bottom of smlnj.org and link to this Whosebug post and say what uname -r does on your system, or supply a diff,特别适合您的系统。