SML / NJ using CM.make: "Error: Illegal Character"

I am trying to compile the following program from Shipman 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 this:

 group is $/basis.cm echo.sml 

When starting CM.make "echo.sml"; The following error message appears:

 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 top level, I can compile it just fine. Does anyone know what happened?

+5
source share
1 answer

I think you are just calling CM in the wrong file. It should be called in the .cm file, not in the .sml file. Since CM is looking for CM syntax, not SML syntax, it will display syntax errors for you.

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

2.3 Calling CM

Once the library has been configured, as shown in the example above, it can be loaded into the working session by calling the CM.make function. If the name of the library description file is, say, fb.cm , then type

 CM.make "fb.cm"; 

Using CM in this way, I was able to compile your example without any problems, and then run the program as follows:

 $ sml @SMLload=echo.x86-darwin abcde abcde 

(After the documentation for SML_OF_NJ.exportFn ).

+6
source

All Articles