|
|
1.1 ! root 1: Help: A few hints for beginning users of SML of NJ ! 2: ! 3: 1. running Standard ML ! 4: ! 5: Type "sml". This puts you into the interactive system. The top level ! 6: prompt is "- ", and the secondary prompt (printed when input is ! 7: incomplete) is "= ". If you get the secondary prompt when you don't ! 8: expect it, typing ";<return>" will often complete your input, or type ! 9: your interrupt character (e.g. ^C) to cancel your input and return you ! 10: to top level. ! 11: ! 12: If "sml" doesn't work, ask where sml has been installed on your machine ! 13: and use the appropriate path name or redefine your PATH environment variable. ! 14: ! 15: 2. interactive input ! 16: ! 17: Input to the top level interpreter (i.e. declarations and expressions) ! 18: must be terminated by a semicolon (and carriage return) before the ! 19: system will evaluate it. The system then prints out a response ! 20: indicating the effect of the evaluation. Expressions are treated as ! 21: implicit declarations of a standard variable "it". For example, ! 22: ! 23: - 3; <return> <- user input after prompt ! 24: val it = 3 : int <- system response ! 25: ! 26: This means that the value of the last top level expression evaluated ! 27: can be referred to using the variable "it". ! 28: ! 29: 2. changing the prompts ! 30: ! 31: The primary and secondary prompt strings are the contents of the ! 32: references ! 33: ! 34: System.Control.primaryPrompt ! 35: System.Control.secondaryPrompt ! 36: ! 37: These can be redefined by assignment, e.g.: ! 38: ! 39: - System.Control.secondaryPrompt := "(**)"; ! 40: ! 41: 3. interrupting parsing or computation ! 42: ! 43: Typing your interrupt character should interrupt the compiler and ! 44: return you to top level, unless some function is catching the ! 45: Interrupt exception (a dangerous thing to do). ! 46: ! 47: 4. exiting the interactive system ! 48: ! 49: Typing ^D (EOF) at top level will cause an exit to the shell (or the ! 50: parent process from which sml was run). ! 51: ! 52: 5. loading ML source text from a file ! 53: ! 54: The operator use: string->unit interprets its argument as a Unix file ! 55: name relative to sml's current directory and loads the text from that ! 56: file as though it had been typed in. "use" should normally be ! 57: executed at top level, but the loaded files can also contain calls of ! 58: use to recursively load other files. It is a bad idea to call use ! 59: within an expression or declaration, because the effects are not ! 60: well-defined. ! 61: ! 62: 6. saving an image of the system ! 63: ! 64: Use the function exportML: string->bool to dump an image of the ! 65: current sml system including the environment that you have built. The ! 66: argument is the path name of the image file that is created. The ! 67: result false is returned in the original system, while in the saved ! 68: image the value returned is true. The call of exportML can be ! 69: embedded in an expression which will continue evaluation (e.g. to ! 70: print a message) in both the original system and in the image when it ! 71: is run, and its effect can depend on the result of the exportML call. ! 72: For example: ! 73: ! 74: if exportML("saved") ! 75: then print "this is the saved image\n" ! 76: else print "this is the original process\n" ! 77: ! 78: The saved image file is an executable binary, and can be run by typing ! 79: the file name as a command to the shell. (Access to command-line ! 80: arguments and Unix environment variables when running the saved image ! 81: may be accomplished by System.argv and System.environ.) ! 82: ! 83: 7. executing System commands and changing directories ! 84: ! 85: The function system : string->unit spawns a process to execute its argument ! 86: string as a shell command. Thus to find out what the current directory is ! 87: within sml you can evaluate the expression ! 88: ! 89: system "pwd"; ! 90: ! 91: which will cause the current directory to be printed out (there is no ! 92: way at the moment to return the current directory as a string). To ! 93: change the current working directory of sml use the function ! 94: cd :string -> unit, whose argument should be a path name denoting a ! 95: directory. ! 96: ! 97: 8. error messages ! 98: ! 99: The error messages produced by the compiler are not always as helpful ! 100: as they should be, and there are often too many of them. ! 101: ! 102: The compiler attempts to recover from syntactic and type errors so ! 103: that it can detect as many errors as possible during a compilation. ! 104: Unfortunately, it is not very graceful in recovery, and the process ! 105: can cause numerous spurious secondary error messages. ! 106: ! 107: When compiling files, the error messages include a line number. For ! 108: simple syntactic errors this line number is often accurate or off by ! 109: just one line. For other classes of errors, including type errors, ! 110: the line number may not be very useful, since it will often just ! 111: indicate the end of the declaration containing the error, and this ! 112: declaration can be quite large. ! 113: ! 114: There are a number of different forms of type error message, and it ! 115: may require some practice before you become adept at interpreting ! 116: them. The most common form indicates a mismatch between the type of a ! 117: function (or operator) and its argument (or operand). A ! 118: representation of the offending expression is usually included, but ! 119: this is an image of the internal abstract syntax for the expression ! 120: and may differ significantly from the original source code. For ! 121: instance, an "if...then...else..." expression is represented ! 122: internally as a case expression over a boolean value: ! 123: "case ... of true => ... | false => ...". ! 124: ! 125: 9. useful system flags ! 126: ! 127: There are a number of useful system flags and variables, which are ! 128: found in the structure System.Control and its substructures. The ! 129: primary and secondary prompt variable have already been mentioned; ! 130: here are some more: ! 131: ! 132: Printing: System.Control.Print. ... ! 133: ! 134: printDepth : int ref ! 135: controls depth to which complex values and syntax trees are printed ! 136: (default 5) ! 137: ! 138: stringDepth : int ref ! 139: controls how much of a long string will be printed (default 70) ! 140: ! 141: signatures : bool ref ! 142: when true, signatures, and the signatures of structures, will be ! 143: printed when these are defined at top level (default true) ! 144: ! 145: Garbage collection messages: ! 146: ! 147: System.Control.Runtime.gcmessages: int ref ! 148: when 0, no messages are printed ! 149: when 1, only major collections are reported (the default) ! 150: when 2, major collections and heap resizings are reported ! 151: when 3, minor and major collections and heap resizings are reported ! 152: ! 153: Memory use: ! 154: ! 155: System.Control.Runtime.ratio : int ref ! 156: determines the desired ratio between size of live data and total heap ! 157: size. Default is 5, and 3 is the smallest acceptable value. A higher ! 158: ratio causes more aggressive use of memory (up to the softmax bound). ! 159: ! 160: System.Control.Runtime.softmax : int ref ! 161: suggested ceiling on heap size, in bytes. Heap size will not grow ! 162: beyond this value except to maintain the "minimum" ratio of 3. Actually, ! 163: when hard limits are reached (e.g. as determined by limit datasize), the ! 164: system can continue to run as long as the actual ratio is greater than 2. ! 165: A good value for softmax is one that reflects the amount of physical ! 166: (not virtual) memory that is expected to be available for the sml process, ! 167: for instance, 5000000 (5MB) might be appropriate on an 8MB Sun 3. ! 168: ! 169: 10. Timing ! 170: ! 171: The structure System.Timer, which has the signature ! 172: ! 173: signature TIMER = ! 174: sig ! 175: datatype time = TIME of {sec : int, usec : int} ! 176: type timer ! 177: val start_timer : unit -> timer ! 178: val check_timer : timer -> time ! 179: val makestring : time -> string ! 180: val add_time : time * time -> time ! 181: end ! 182: ! 183: provides basic facilities for timing your code. Here is how a typical ! 184: timing function could be implemented: ! 185: ! 186: fun timeit (f: unit->'a) = ! 187: let open System.Timer ! 188: val start = start_timer() ! 189: val result = f() ! 190: in print(makestring(check_timer(start))); ! 191: print "\n"; ! 192: result ! 193: end; ! 194: ! 195: 11. Profiling ! 196: ! 197: See the file doc/profiling for instructions on using the built-in ! 198: profiling facilities. ! 199: ! 200: 12. Basic ML environment ! 201: ! 202: Look at the files src/boot/perv.sig and src/boot/system.sig ! 203: for signatures that specify what is available in the basic environment.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.