Annotation of researchv10no/cmd/sml/doc/differences, revision 1.1

1.1     ! root        1: This file attempts to list differences between the Edinburgh compiler
        !             2: and SML of New Jersey, as an aid to converting programs to run under
        !             3: the new compiler.  Items that are likely to break old code are
        !             4: annotated with "!!!".  The version of the Edinburgh compiler we have
        !             5: used for comparison is quite old, and many of these differences may
        !             6: not apply to the latest version.  Users who find other differences can
        !             7: help keep this file up to date by sending mail to:
        !             8: 
        !             9:        macqueen%[email protected]
        !            10: 
        !            11: 
        !            12: Pervasives
        !            13: 
        !            14: * The type of use is different; it is now applied to strings instead
        !            15:   of string lists.  Users who prefer the old version of use can
        !            16:   redefine it:
        !            17:        val use = app use    !!!
        !            18: 
        !            19: * Structure Byte_array has been renamed ByteArray, and there have been
        !            20:   significant changes in the structure itself, including renaming of
        !            21:   functions to parallel those in the structure Array, and the addition
        !            22:   of a new exception Range.  The new signature BYTEARRAY is defined in
        !            23:   boot/perv.sig.  As before, ByteArray is not opened by default in
        !            24:   the pervasive environment.  !!!
        !            25: 
        !            26: * Strings and byte arrays are not limited to 65535 characters as they
        !            27:   were in the Edinburgh system.
        !            28: 
        !            29: * There have been significant changes in the IO interface.  The BasicIO
        !            30:   and ExtendedIO structures have been replaced by structure IO, which
        !            31:   matches signatures BasicIO and IO (signature ExtendedIO has been eliminated).
        !            32:   The IO and BASICIO signatures can be found in boot/perv.sig.
        !            33: 
        !            34: * IO.input and IO.output are curried. !!!
        !            35: 
        !            36: * IO.can_input now returns the number of characters which can be read from
        !            37:   an instream without blocking.
        !            38: 
        !            39: * List.exists has been curried. !!!
        !            40: 
        !            41: * List.@ now associates to the right.
        !            42: 
        !            43: * The type of exportML has changed:
        !            44:        val exportML : string -> bool
        !            45:   The string is the file to export to, and the boolean returned distinguishes
        !            46:   between a new ML process (true) and the return from exportML (false).
        !            47:   In the Edinburgh system, exportML returned the new process to top level;
        !            48:   in our system, the new process takes up exactly where exportML would have
        !            49:   returned to.
        !            50: 
        !            51: * The obsolete exception Varstruct is not supported; Bind should
        !            52:   be used instead.  !!!
        !            53: 
        !            54: 
        !            55: Core
        !            56: 
        !            57: * We use the new exception syntax.  !!!
        !            58: 
        !            59: * We use the new form of numeric record labels, for example {2=5,3=true}. !!!
        !            60: 
        !            61: * Record label abbreviations work only in patterns, not in expressions:  !!!
        !            62:       val a = 4 val b = {a,c=3}    
        !            63:            does not work on our system, but these will:
        !            64:       val a = 4 val b = {a=a,c=3} 
        !            65:       fun f {a : int, c = 3} = ... 
        !            66: 
        !            67: 
        !            68: Modules
        !            69: 
        !            70: * Functors may have free references to structures that are not parameters.
        !            71: 
        !            72: * Sharing constraints are now components of signatures.
        !            73: 
        !            74: * Functor parameter syntax is slightly different:  !!!
        !            75:   Two styles of functor syntax are now supported.  The parameter list following
        !            76:   the functor name in a functor declaration can consist either of a single
        !            77:   structure name with a signature, or it can consist of a sequence of specifications
        !            78:   like those in the body of a signature.  For example:
        !            79:        functor F(X: sig structure A: SA and B: SB end) =
        !            80:        struct
        !            81:         ... X.A ... X.B ...
        !            82:        end
        !            83:    or
        !            84:        functor F'(structure A: SA and B: SB) =
        !            85:        struct
        !            86:         ... A ... B ...
        !            87:        end
        !            88:   Corresponding functor applications would have the forms
        !            89:        F(<strexp>)
        !            90:    or
        !            91:        F'(structure A = <strexp> and B = <strexp>)
        !            92: 
        !            93: 
        !            94: All of the features above are documented in the manual (???).
        !            95: 
        !            96: 
        !            97: Undocumented features of our compiler:
        !            98: 
        !            99: * val cd : string -> unit
        !           100:    allows you to change working directories without leaving ML.
        !           101: 
        !           102: * val exportFn : string * (string list*string list -> unit) -> unit
        !           103:    exportFn takes a string and a function, and exports the function
        !           104:    to the file specified by the string.  Only the function itself and
        !           105:    code it is dependent on are exported; this will be much smaller
        !           106:    than the file produced by exportML (which contains the entire
        !           107:    compiler).  The exported function will be applied to a list of
        !           108:    command-line arguments and a list of the (Unix) environment on startup.
        !           109:    Because exportFn "throws away" the compiler by forcing a special
        !           110:    garbage collection, it never returns.
        !           111: 
        !           112: * Two functions are provided which allow the user to construct and
        !           113:    execute ML code on the fly:
        !           114:            val open_string : string -> instream
        !           115:            val use_stream : instream -> unit
        !           116:    use_stream is like use except that it is applied to an instream
        !           117:    rather than a file name.  open_string converts a string to
        !           118:    an instream.
        !           119: 
        !           120: * A structure System is present in the initial environment.  The structure
        !           121:   contains special values used by the compiler, which for the most
        !           122:   part should be left alone.  Two substructures may be of some
        !           123:   use: System.Control contains a number of flags which control
        !           124:        compiler behavior.  They are not documented anywhere,
        !           125:        and some have unobvious functions, so it is unwise to play
        !           126:        with those which seem cryptic.
        !           127:        System.Timer contains some elementary timing functions.
        !           128:   Both have signatures defined in boot/system.sig, and both are
        !           129:   subject to change at any time.
        !           130: 
        !           131: * System.version : string
        !           132:    a string identifying the version and origin date of the compiler.
        !           133: 
        !           134: * exception SystemCall of string
        !           135:    may be raised by the functions system and cd, or in
        !           136:    unusual failures of system calls.
        !           137: 
        !           138: * exception Real of string
        !           139:    may be raised by generic exceptions like overflow
        !           140:    encountered in floating point operations.
        !           141: 
        !           142: * exception Overflow
        !           143:    is raised by integer overflow (bigints are not supported).

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.