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?
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 typeCM.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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With