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 Списки сценариев оболочки будут работать.


Только в том случае, если вы заинтересованы в устранении проблемы для других:

  1. Выясните, поддерживает ли последняя версия 110.85 MacOS > 10.10.

  2. Если нет, напишите на электронную почту в нижней части smlnj.org и ссылку на этот пост Stackru и скажите, что uname -r делает в вашей системе, или поставьте diff, который работает для вашей системы в частности.

Другие вопросы по тегам