sml: невозможно определить операционную систему в emacs, но нормально работает в терминале
Мне удалось установить smlnj на мою MAC OS 10.14 Mojave. Это работает просто отлично в терминале. Затем у меня возникли проблемы с установкой пакета sml в emacs. Когда я что-то печатаю в файле.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:
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;;
Сценарий оболочки .arch-n-opsys
это тот, который определяет операционную систему, которую вы используете. Таким образом, кажется, что система выполнения SML/NJ 110.77 не обнаруживает MacOS за пределами 10.10. Почему это не проблема вне Emacs, я не уверен.
Вы можете попробовать запустить программу из Emacs через Mx shell
RET и введите:
cd /usr/lib/smlnj/bin
ls -a
./.arch-n-opsys
Я подозреваю, что вы можете решить эту проблему локально, если вы замените это .arch-n-opsys
двоичный файл с крошечным сценарием оболочки, который жестко кодирует ваши предпочтительные параметры, которые, вероятно,:
#!/bin/sh
echo "ARCH=darwin; OPSYS=darwin; HEAP_SUFFIX=darwin-darwin"
Если это не сработает, возможно, некоторые из других вариантов, которые оригинал .arch-n-opsys
Списки сценариев оболочки будут работать.
Только в том случае, если вы заинтересованы в устранении проблемы для других:
Выясните, поддерживает ли последняя версия 110.85 MacOS > 10.10.
Если нет, напишите на электронную почту в нижней части smlnj.org и ссылку на этот пост Stackru и скажите, что
uname -r
делает в вашей системе, или поставьте diff, который работает для вашей системы в частности.