5
votes

I'm trying to compile the following program from Shipman's Unix System Programming with 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

My .cm file looks like:

group is
    $/basis.cm
    echo.sml

When I run CM.make "echo.sml"; I get the following error message:

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

However, when I run use "echo.sml"; from the toplevel I can compile just fine. Anyone know what's wrong?

1

1 Answers

7
votes

I think you're just calling CM on the wrong file. It should be called on the .cm file, not the .sml file. Since CM is looking for CM syntax, not SML syntax, it throws syntax errors back at you.

From the new version of the CM manual [pdf]:

2.3 Invoking CM

Once a library has been set up as shown in the example above, one can load it into a running interactive session by invoking function CM.make. If the name of the library’s description file is, say, fb.cm, then one would type

CM.make "fb.cm";

Using CM this way, I was able to compile your example without any problem, and then run the program like so:

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

(Following the documentation on SML_OF_NJ.exportFn).