SML/NJ с использованием CM.make: "Ошибка: недопустимый символ"

Я пытаюсь скомпилировать следующую программу из системного программирования Shipman Unix с помощью Standard ML:

structure Main=
struct

    fun main(arg0, argv) =
    (
        case argv of
          [] => ()
        | (first::rest) =>
        (
            print first;
            app (fn arg => (print " "; print arg)) rest;
            print "\n"
        );

        OS.Process.success
    )

    val _ = SMLofNJ.exportFn("echo", main)
end

Мой файл.cm выглядит так:

group is
    $/basis.cm
    echo.sml

Когда я бегу CM.make "echo.sml"; Я получаю следующее сообщение об ошибке:

gotchops@gotchops-vm:~/Documents/USPwSML/Ch2/echo$ CM_ROOT=echo.cm sml
Standard ML of New Jersey v110.80 [built: Fri Sep 16 22:36:30 2016]
- CM.make "echo.sml";
[autoloading]
[library $smlnj/cm/cm.cm is stable]
[library $smlnj/internal/cm-sig-lib.cm is stable]
[library $/pgraph.cm is stable]
[library $smlnj/internal/srcpath-lib.cm is stable]
[library $SMLNJ-BASIS/basis.cm is stable]
[library $SMLNJ-BASIS/(basis.cm):basis-common.cm is stable]
[autoloading done]
[scanning echo.sml]
echo.sml:7.11 Error: illegal character: [
echo.sml:7.12 Error: illegal character: ]
echo.sml:1.2-1.16 Error: syntax error: deleting  STRUCTURE ML_ID
echo.sml:6.9 Error: syntax error: inserting  RPAREN
echo.sml:8.17-8.19 Error: syntax error: deleting  COLON COLON
echo.sml:11.14 Error: syntax error: replacing  LPAREN with  RPAREN
echo.sml:11.32-11.34 Error: syntax error: deleting  FILE_NATIVE
echo.sml:11.47 Error: syntax error: inserting  LPAREN
echo.sml:12.16-12.19 Error: syntax error: replacing  FILE_NATIVE with LPAREN
echo.sml:13.10 Error: syntax error: inserting  LPAREN
echo.sml:17.30-17.35 Error: syntax error: deleting  FILE_NATIVE
echo.sml:19.1 Error: syntax error found at EOF
val it = false : bool

Тем не менее, когда я бегу use "echo.sml"; с верхнего уровня я могу скомпилировать просто отлично. Кто-нибудь знает, что не так?

1 ответ

Решение

Я думаю, что вы просто звоните CM не на тот файл. Это должно быть вызвано на .cm файл, а не .sml файл. Поскольку CM ищет синтаксис CM, а не синтаксис SML, он отбрасывает синтаксические ошибки обратно на вас.

Из новой версии руководства по CM [ pdf]:

2.3 Вызов CM

После того, как библиотека была настроена, как показано в примере выше, ее можно загрузить в запущенный интерактивный сеанс, вызвав функцию CM.make, Если имя файла описания библиотеки, скажем, fb.cmтогда можно было бы напечатать

CM.make "fb.cm";

Используя CM таким образом, я смог без проблем скомпилировать ваш пример, а затем запустить программу так:

$ sml @SMLload=echo.x86-darwin a b c d e
a b c d e

(Следуя документации на SML_OF_NJ.exportFn).

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