Использование преемника ML с SML/NJ

99
12

Я был приятно удивлен, когда увидел, что SML/NJ недавно внес некоторые существенные изменения в версия 110.79, которая является частью движения к чему-то, что называется Преемник ML. Это похоже на совместное предприятие между SML/NJ и MLton и служит хорошим предзнаменованием для будущего SML.


Однако, я пытаюсь использовать некоторые из новых функций, похоже, сталкивается с странной ошибкой (в 64-разрядной Windows 7). Чтобы попробовать, я написал следующее в файле с именем sml_successor_test.sml:


Control.succML := true;
val n = 123_456;
print (Int.toString n);

когда я пытаюсь загрузить его в REPL с помощью use "C:\Programs\sml_successor_test.sml";, компилятор не работает во второй строке файла (который использует новый тип числового литерала, который должен быть включен). Но - когда я немедленно запускаю ту же самую команду use, что и раньше, она работает.


Если сначала использовать Control.succML := true; в REPL, а затем использовать use для загрузки файла (после удаления этой строки из файла), он работает. С другой стороны, если я просто запускаю SML, включите succML, а затем присвойте val n = 123_456; непосредственно в REPL, он не работает в первый раз, но затем работает.


Подводя итог - кажется, существует странное отставание между тем, когда Control.succML := true оценивается и когда оно вступает в силу, отставание, которое происходит в некоторых контекстах, но не в других. Любая идея, что стоит за этим и любым обходным способом?

спросил(а) 2021-01-25T21:32:06+03:00 4 месяца, 4 недели назад
1
Решение
77

Это вариация принятого ответа. Я использовал идею @IonutGStan обертки script следующим образом. Я создал программу VBScript с именем SuccessorML.vbs с кодом:


Set WS = WScript.CreateObject("WScript.Shell")
WS.RUN("sml -Cparser.succ-ml=true")

и поместите значок в папку, в которую я обычно запускаю программу. Когда я нажимаю на нее, появляется экземпляр SML REPL с включенными функциями-преемниками. У меня уже есть путь к sml на моем системном пути. Если вы этого не сделаете - вам нужно будет добавить полный путь в команду run.


В Windows команда sml ссылается на небольшой файл .bat. Возможно, вы можете отредактировать этот файл, чтобы он открывал sml с включенным succ-ml - мне нравится идея легко запускать SML в любом случае.

ответил(а) 2021-01-25T21:32:06+03:00 4 месяца, 4 недели назад
77

Это происходит и с Mac OS X. Однако я использовал флаг -Cparser.succ-ml=true в моем псевдониме sml, который ведет себя как ожидалось:


alias sml="rlwrap /usr/local/bin/sml -Cparser.succ-ml=true"

Я забыл, что эквивалентно Windows. Возможно, вам придется создать свою собственную оболочку sml script и поместить ее перед SML/NJ в PATH.

ответил(а) 2021-01-25T21:32:06+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема