Home
        SML.NET User Guide - University of Cambridge
         Contents
1.        process ints     and m x string option       process Strings     end    4 LANGUAGE EXTENSIONS FOR  NET 34    functor Wrapper type T     struct  _classtype W x   T     with  get     x  end  fun wrap  x   T    W x   fun unwrap  w   W    w  get      end    structure IntListWrapper   Wrapper  type T   int list   structure IntFunWrapper   Wrapper  type T   int  gt int     Figure 2  Using functors       4 8 2 Class types and functors samples classfunctor             At present  the CLR does not support parametric polymorphism  We therefore  restrict the types of methods in classes to be monomorphic  However  using  SML    s functor construct  it is still possible to parameterise classes on types and  values  Figure 2 gives an example    When applied to a particular type T  the functor provides a new class type  W and functions wrap and unwrap that convert values between T and W  The  class types IntListWrapper W and IntFunWrapper W can then be used to pass  around objects that wrap up SML values of type int list and int  gt int   If  one wished to use these wrapper classes to  for example  store SML values in   NET collections  one would also have to include a hash function and equality  test in the class         4 8 3 Interface declarations samplesl interfaces             SML NET users may declare their own interface types  The syntax of interface  declarations is similar to that of classtype declarations  but more restricted   An interface type must have no constructor  no
2.     Attributes can be attached to certain  but by no means all  declarations in  an SML NET program using attribute expressions    An SML NET attribute expression is an essentially static description of the  data required to construct the corresponding instance of the attribute class when  demanded to do so by reflection  Syntactically  an attribute expression is simply  an application of an instance constructor of some attribute class to an n tuple  of constant arguments  n  gt  0   For instance  we might annotate another class   MLClass    as follows     _classtype  MLAttribute  this is a class attribute     MLAttribute  this is another class attribute         MLAttribute  this is a constructor attribute     MLClass     with   MLAttribute  this is a method attribute    method          end    An attribute expression may be further modified by a sequence of  mutable   field and property initialisers  again supplied with constant values  The initialis   ers are executed in order  just after the instance is constructed by reflection    For instance  attribute instances of the above CSharpAttribute type may  be qualified as follows     CSharpAttribute   where Field   SOME  field value  end   CSharpAttribute   where Property SOME  property value   end   CSharpAttribute   where  Field   SOME  field value    Property SOME  property value    end     NB  in named arguments  we use the name of the property   not the name of the set method       Ignoring any type annotations used to re
3.     directory  source   source    Extends  queries or resets path in which source files are searched for     structure strid filename        strid filename  structure  strid filename         strid filename  structure strid   structure  strid   structure      structure   Extends  queries or resets mapping of structures to files     signature sigid filename         sigid filename  signature  sigid filename         sigid filename  signature sigid   signature  sigid   signature   signature   Extends  queries or resets mapping of signatures to files     functor funid filename         funid filename  functor  funid filename         funid filename  functor funid   functor  funid   functor   functor   Extends  queries or resets mapping of functors to files     make  Compile the current project  linking and assembling only if the sources have  changed or the target does not exist     3 COMPILING PROGRAMS 16    remake  Recompile the current project  linking and assembling even if the sources have  not changed     export strid  classname         strid  classname   export  strid  classname         strid  classname   export    export    Extends  queries or resets the set of structures to be exported as  NET classes     reference libname        libname  reference  libname        libname  reference   reference    Extends  queries or resets the set of external  NET libraries   d11s  referenced  by the current project     lib directory         directory  lib  directory         directory  lib 
4.     fun nodetoxmldata  n   XmlNode     case n of  elem   gt  XmlElement   gt   let val SOME name   elem ttget_Name     val first   elem ttget_FirstChild  O  val children   gather  first       in SOME  Elem name  List mapPartial nodetoxmldata children    end      data   gt  XmlCharacterData   gt   let val SOME s   data  get_Data    in SOME  C stringtoscalar s    end      _   gt  NONE    The pattern id   gt  ty matches only when the examined expression has the class  type ty  in which case the identifier id is bound to the expression casted down  to type ty    Cast patterns can be used like any other pattern  They can appear in val  bindings  as in    4 LANGUAGE EXTENSIONS FOR  NET 23    val x   gt  System Windows Forms Window   y    to give an effect similar to downcasting in expressions but raising SML   s Bind  exception when the match fails  They can also be used in exception handlers   such as    val result    f y   handle e   gt  System Security SecurityException   gt  0    in order to handle  and possibly deconstruct   NET exceptions  The order in  which handlers appear is important  In the example below  the exception type  DivideByZeroException is a subclass of  ArithmeticException so if the handlers were switched the second handler  would never be reached     fun test x    do_some_stuff x   handle y   gt  ArithmeticException   gt  f y    _   gt  DivideByZeroException   gt  g x    Finally  the behaviour of C    s e is c can be emulated by    case e of _   gt  c   gt  t
5.   0   and moveVert yinc   this  move  0  yinc   end    _classtype ColouredPoint x  y  c    Point x  y   with  getColour      c   System Drawing Color  and move  xinc  yinc    this   move  xinc 2  yinc 2   end  end    Figure 1  Coloured points in SML NET    The special identifier this has the same meaning as in C    referring to the  object on which a method was invoked  It is used in Point to define horizontal  and vertical movement using the more general move method    The C  language provides a syntax  base  which allows a method overridden  by a subclass to invoke the method that it is overriding  Instead  we provide a  syntax       exp    method name             that can be used only within a class definition on objects of that same class   and means    invoke method method name in the superclass  ignoring any over   riding of the method in the current class     It is used in ColouredPoint to  redefine move using the move method defined in Point  making coloured points     faster movers    than plain points  By the magic of virtual method dispatch  the  moveHoriz and moveVert inherited by coloured points also inherit this speed  increase    As mentioned in Section 4 4 3   NET allows overloading of methods  We  support this in _classtype declarations in order to extend existing  NET classes  that include overloaded methods  No special syntax is required  the method  name is simply repeated in separate declarations  as in the example below     _classtype C     with  m x int
6.   The second parameter is a  pseudo  or phantom  type that identifies the particular kind of storage cell  The  kind of a storage cell describes its physical representation and thus the precise  runtime instructions needed to implement reads and writes    The advantage of introducing a parametric notion of storage cell  indexed  by kind  is that it allows SML NET to treat   and    as generic operations   polymorphic  as in ML  in the contents of a storage cell but also polymorphic  in the physical representation of that cell  To achieve this  we generalise the  Standard ML types of these operations to the following kind polymorphic types  in SML NET    val      ty kind  reference   gt  ty  val        ty kind  reference   ty    gt  unit    In practice  this means that you can use the same familiar notation    and      to manipulate all kinds of storage cells  even though they compile to rather  different runtime instructions     4 7 1 Storage kinds    The kind parameter of a storage cell of type  ty kind  reference can take  one of the following forms     4 LANGUAGE EXTENSIONS FOR  NET 29    heap  used for ordinary Standard ML references  this kind describes a single   field  ML allocated object  Standard ML s primitive ty ref type con   structor is defined as an abbreviation for the SML NET reference type     type ty ref    ty heap  reference    Thus Standard ML   s ref function  that allocates a new ref cell  actually  has type     val ref   ty   gt  ty ref    ty   gt   ty h
7.   convention identifies the entry point for an executable  as is the case in C       2 5 Demonstration programs    The distribution comes with a few more demos  Explore the demos subdirectory  for details and documentation     3 COMPILING PROGRAMS 9    3 Compiling programs    In this section we discuss in detail the compilation environment provided by  SML NET    Within the environment you can type help or just   to get a list of available  commands  For details on a particular command  type help command     3 1 Command syntax    In general a command consists of an alphabetic keyword optionally followed by  parameters separated by commas  The case of keywords is ignored  Parameters  representing file or directory names must be enclosed in quotes if they include  spaces    Most commands set or extend the value of some setting such as a path or  filename  For these the current setting can be queried by typing the command  followed by          For example  log  displays the filename currently used for  logging compiler messages     3 2 Mapping of module identifiers to files    A multiple module SML NET program usually consists of a collection of top   level SML structures and signatures  each stored in a separate file  In contrast  to other compilation managers  SML NET does not require the programmer  to list explicitly the files making up a project  Instead  given the location of  SML defined structures and types to be exported as classes  using export  and  a means of mapping
8.   lib    Extends  queries or resets path in which  dlls are searched for     target exe  target exe  target library  target  library  target   Sets or queries whether current project is an executable or a library     out name   out  name   out name exe   out  name  exe   out name dll   out  name d1l1   out    out  Sets  queries or resets file name for compiler output and  optionally  project  type     run args  Runs the current project  if executable and built  with specified command line  arguments     cmd command  cmd  command  Runs the specified shell command     cd directory  cd  directory  cd   Sets or queries the current working directory     3 COMPILING PROGRAMS 17    log filename  log  filename  log  Sets compilation log file and starts logging  or stops logging     on option   on  option   option    option   off option   off  option   option    option   Where option is one of debug  debug exnlocs  debug symfromloc   sml seqwithtype  warn value  warn match  warn bind  verbose  Sets  re   sets or queries the associated compiler flag     ilasm option  value         option  value   ilasm  option  value         option  value   ilasm   ilasm    Extends  queries or resets the additioanl options passed to the  NET assembler   ilasm  Useful for signing assemblies  adding resources such as icons  etc      name  Executes commands from file name smlnet     3 17 Trouble with the  NET IL assembler ilasm exe     There is a bug in the 1 0 and 1 1 versions of ilasm exe  the IL assemb
9.  2000 or XP  and some of the server side parts of  NET require  the Server or Professional versions of those operating systems      NET Framework  Available from http   msdn microsoft com net  The  Redist includes the runtime  libraries and tools  notably an assembler   required to run SML NET  The SDK includes full documentation  sam   ples  and other tools  e g  a disassembler and stand alone verifier  which  you may find useful  Visual Studio  NET is also useful if you wish to  write parts of your applications in Cf or VB  In particular  you can de   sign user interfaces graphically and then link the autogenerated code with  SML NET code     An editor  The SML NET compiler is not an integrated development environ   ment  so  unless you install the optional support for Visual Studio  NET   Section 5   you will need a text editor  Typically you will run the editor  concurrently with the SML NET compilation environment        SML NJ compiler  optional   The SML NET compiler was developed us   ing Standard ML of New Jersey  SML NJ   If you wish to build the  SML NET compiler from sources then you will need SML NJ version 110   obtainable from http   cm bell labs com cm cs what smlnj     2 2 Installation    To install SML NET  simply unpack the distribution smlnet   tar gz to obtain  a directory smlnet  The compiler can be run directly from the bin subdirectory  but for convenience you may want to extend PATH with this directory   IMPORTANT  To avoid problems  please unpack you
10.  A  92 Requirements o  icons  58 Installation coe a 4 444555 8S eee eee EE EERE HES  5 4 Working In Visual Studio  lt s s o s moo  lt ooooooo   o      5 4 1 Opening an existing Project                   5 4 2 Creating a new Project           lt    lt o     lt      Bab Debugging  or ias a Ea  5 5 Customizing the Package Installer                    A Language restrictions  AL Cid  foe dra aaa  A 2 Non uniform datatypes           o     AS Vale TOSTTICUOD  asas a A i E  AA Overloading   cocida aa rn aa Ge od    B The Standard ML Basis Library    1 INTRODUCTION 3    C Support for ML Lex  ML Yacc and SML NJ Libraries 43    1 Introduction    SML NET is a Standard ML compiler  2  3  for the NET Common Language  Runtime  Its features are     Support for all of Standard ML  SML NET compiles all of SML    97  2  ex   cept for some minor omissions documented in Appendix A     Support for the Basis library  Almost all of the Standard ML Basis Li   brary  1  is implemented  Omissions and discrepancies are listed in Ap   pendix B     Command line compilation  SML NET supports traditional compilation from  the command line     Interactive compilation environment  Alternatively  you can control the  compiler from an interactive environment  This lets you set and query  options incrementally and to see the signatures of compiled and imported  SML modules     Support for Visual Studio  NET  This distribution includes an optional   experimental package for Visual Studio  NET that allows you to 
11.  NET   s coverage further    PITFALL  Cf assumes all attribute class names have the suffix Attribute  and allows the programmer to omit the suffix from attribute expressions  In  SML NET  we make no such assumption  but require the full name of the at   tribute class in attribute expressions     4 10 Exporting structures    By default  all SML NET declarations are private to the generated executable  or DLL  In order to make declarations available outside     even simply to expose  an entry point     it is necessary to export selected top level structures using the  compiler   s export command    In the current version of the compiler it is only possible to export structures  whose signature can be mapped directly back to  NET types  The following  rules are applied for export     e Top level SML structures are exported as  NET classes  possibly in some  namespace if specified by the export command     e Value bindings with function type are exported as static methods  A  function type is exportable if        Its result type is an exportable type         Its argument type is either unit  an exportable input type  or a tuple  of exportable input types  An argument type  or tuple component   may also be the address of an exportable input type  akin to C s  ref and out parameters      e Value bindings with exportable types are exported as static read only  fields     e Class  interface and delegate type declarations are exported as  NET   nested  classes  if         The type of 
12.  SML signature  structure and functor identifiers onto file  names  SML NET determines automatically which files it must compile    The most straightforward way to operate is to put each structure strid into  a file called strid   sml  each functor funid into a file called funid sm1  and each  signature sigid into a file called sigid sig  Users of Moscow ML will be familiar  with this pattern  The compiler then just starts its dependency analysis from  the root structures specified using the export command    PITFALL  SML NET will not infer dependencies that are not there in the  source  Thus if your project includes file State sml  containing    structure State   struct  val state   ref  NONE  string option   end    file Effect sml  containing    structure Effect   struct  val _   State state    SOME  initialised    end    and file Main sml  containing    structure Main   struct  fun main     case  State state of NONE   gt  1   SOME s   gt   print s 0   end    3 COMPILING PROGRAMS 10    then exporting Main alone will drag in State  but will not drag in the purely  side effecting initialisation code in Effect sml  Note that Main does not ref   erence Effect  either directly or indirectly via the referenced entity State    To force the evaluation of Effect  you must add an explicit reference to the  Effect structure  for instance by inserting a vacuous local open Effect in  end declaration to Main     structure Main   struct   local open Effect in end   fun main     case  Stat
13.  Section 4 7 3     4 7 2 Address operators   amp      It is possible to take the address of any kind of storage cell  including another  address reference  using the SML NET primitives     type ty  amp     ty address  reference  val  amp  i  ty kind  reference   gt  ty  amp      ty kind  reference   gt   ty address  reference    The  amp  function allows you to pass any kind of SML NET storage cell  including  an SML ref  to a C   method expecting a call by reference parameter  marked  as ref or out in C   by taking  and then passing  the address of that cell    For instance  given the C   swap function     public static void swap ref int i  ref int j    int temp   i  i   j  j   temp  return          4 LANGUAGE EXTENSIONS FOR  NET 30    which is imported with SML NET type     val swap   int  amp    int  amp    gt  unit    Then we can swap the contents of two  ML  references as follows     val  ra rb     ref 2 ref 3   val _   swap  amp  ra  amp  rb   val  ref 3 ref 2     ra rb     Operationally  taking the address of a storage cell returns the address of the  particular field storing its contents  taking the address of an address is simply  the identity     4 7 3 Byref types    The various kinds of storage in SML NET fall into two categories  storage cells  whose representations are first class values of the CLR and storage cells whose  representations are second class CLR  addresses  References of kind address  and  less obviously    classty  fieldname  field  where classty i
14.  These are displayed  whenever SML   s value restriction prevents the generalisation of a type in  a val binding  see Section A 3 for more details      warn match Non exhaustive match warnings  default  on   These are displayed when  a case or handle does not handle all possible values and so could result  in the Match exception being thrown     warn bind Non exhaustive bind warnings  default  on   These are displayed when a  val binding can result in the Bind exception being thrown     verbose Verbose compiler messages  default  off         3 12 Additional assembler options ilasm             It is sometimes necessary  or just convenient  to be able to pass extra command   line options to the assembler  The ilasm command takes a comma separated  list of additional options with their values  if any  For instance     ilasm CLOCK  KEY keyFile snk    instructs ilasm exe to report timings and generate a signed assembly using  the key pair in file keyFile snk when next invoked by the compiler  see the  ilasm exe documentation   These settings correspond to the concrete shell  command ilasm exe      CLOCK  KEY keyFile snk      Note that the  extra options are passed to ilasm in addition to any options already implied by  other SML NET settings  The commands ilasm and ilasm  reset and query  the current options     3 COMPILING PROGRAMS 14    3 13 Avoiding stack overflow    By default  under Windows  CLR executables receive a fixed  and fairly low   ceiling on the amount of stack spac
15.  as invocations of a     principal    constructor     e The optional superdecs specifies the superclass that class name extends  and any interfaces that it implements  The superclass clause  which must  occur first  if at all  contains an argument  or tuple of arguments  exp  to pass to the superclass  ty  constructor  If absent  this defaults to  System Object    The remaining types in a superdecs clause must be   distinct  interfaces     e dec is a set of SML declarations that are local to a single instance of the  class     e The optional methoddecs is a simultaneous binding of instance method  declarations  defined using a syntax similar to that of ordinary functions   but with optional qualifiers final and protected preceding the method  identifiers  An abstract method is declared by omitting is implementation   but declaring its type  An abstract method may have an optional  explicit  abstract qualifier  Note that methods may have attributes and that  abstract methods must have function types     The class definition is bound within its own body  allowing recursive ref   erences via this  the methods of a class can have types that mention the  class type itself  7    In keeping with tradition  and to demonstrate that classes are usable in SML NET  without reference to  NET libraries  Figure 1 presents a variation on the classic  coloured point example    Notice the absence of any direct support for field declarations  Instead  the  declarations following local are evalu
16.  local declarations  no superdec  declaring a superclass and base constructor  and no concrete method implemen   tations        dec    _interfacetype   attributes    interface namel   superdecs   with   methoddecs   end    superdec     ty  superdecs     superdec   superdec   superdecs  methoddec       attributes     mmod   method name   ty  methoddecs     methoddec   methoddec and methoddecs             The methods of an interface type  but not its super declarations  may make  recursive references to that interface type          8Direct mutual recursion between interface declarations is not yet supported in this release   but it can be simulated using forward declarations of interfaces     4 LANGUAGE EXTENSIONS FOR  NET 35       4 8 4 Delegate declarations samples delegates             SML NET users may declare their own delegate types  The syntax of delegate  declarations uses a concise form of classtype declaration        dec    _classtype   attributes    delegate name of ty             e The optional  and typically absent  attributes lists any class attributes  see  Section 4 9      e The type argument ty of a delegate must be an SML function type     A delegate declaration declares the type delegate name  the delegate con   structor delegate name of  higher order  type ty   gt  classname  and implicitly  declares an Invoke instance method of the  function  type ty    For example  the BinaryOp delegate class of Section 4 3 2 may be declared  within SML NET as     _classty
17.  or a shared  library   d11  with the following commands     target library  target exe    The default is to produce executables  in which case the compiler expects to  find some exported structure containing a suitable main function    By default  the name of the output is X exe  for executables whose main  function is in structure X  or X d11 for DLLs whose first exported structure is  X  This name can be overridden by typing out name  The syntax out X exe  and out X d11 combines the action of target and out in a single command    To run a successfully compiled executable from within the compilation en   vironment  type    run args    where args are the arguments passed to the executable   You can log the compiler messages to a file by typing log filename  To turn  logging off just type log        3 9 Shell commands cmd  cd             From within the compilation environment you can issue shell commands using  the syntax    cmd command  It is also possible to change the working directory from within the environment   cd directory    The syntax cd  queries its current value        3 10 Printing types and signatures type             The command  type longid    provides type and signature information for any entities with the name longid   These entities may be value bindings  types  structures or exceptions and may  come from external  NET  DLLs  the SML Basis or the current project  type  provides a primitive  but extremely useful  form of online documentation for  use durin
18.  the element type must be an  interop input type in the sense of Section 4 2 5        4 2 4 Null values samplesl option             In  NET  variables with class or array types  known collectively as reference  types  are allowed to take on the value null in addition to object or array  instances  Operations such as method invocation  field access and update  and  array access and update  raise NullReferenceException if their main operand  is null    SML does not have this notion  and values must be bound explicitly when  created  Thus operations such as assignment  indirection  and array access and  update are inherently safer than the corresponding operations on  NET  We  wished to retain this safety in our extensions to SML  and so interpret a value  of  NET reference type as    non null instance       Nevertheless  when a  NET field of reference type is accessed from SML or a  value of reference type is returned from an external method invoked by SML  it  may have the value null and this must be dealt with by the SML code  Also   it should be possible to pass null values to  NET methods and to update  NET  fields with the null value  Fortunately the SML basis library already defines a  type that suits this purpose perfectly     datatype    a option   NONE   SOME of    a    The val0f function  of type    a option   gt     a  can be used to extract the  underlying value  raising Option when passed NONE    We interpret values of  NET reference type that cross the border betw
19. ET to compile and link the program  The compiler will put the  output in a file Sort exe  and the assembler source in a file Sort il  Finally  run executes the program with the arguments specified    Just to prove that we really have compiled a self contained  NET program   from a command prompt type    C  smlnet gt Sort 10    Before sorting  30 7 84 61 38 15 92 69 46 23  After sorting  7 15 23 30 38 46 61 69 84 92    C  smlnet gt     If you have installed the  NET Framework SDK you can type check the  output using the verifier and look at it using the disassembler     C  smlnet gt peverify Sort exe    Microsoft  R   NET Framework PE Verifier  Copyright  C  Microsoft Corporation 1998 2001  All rights reserved     All Classes and Methods in Sort exe Verified    C  smlnet gt ildasm Sort exe    Most of the classes listed by ildasm were generated by SML NET to implement  SML code  but Sort is special  as it was listed explicitly as a parameter to  export  At its simplest  export is followed by a comma separated list of top   level SML structures  each of which will be exported as a class with the same  name  The signature of each structure determines what will appear in the class   Functions are exported as static methods  and other values are exported as  static read only fields  There are strong restrictions on the types of functions  and values that can be exported  described in detail in Section 4    For this example  there is just one exported function  called main  which by
20. NET types  in C   notation and as fully qualified  NET type names   that have direct equivalents in SML NET  Amongst  NET types only the usual  SML Basis types have equality status and can be passed as arguments to SML s  polymorphic equality operator    that is all those in Table 1 except for real   Real32 real and exn        4 2 2 Named  NET types samples namedtypes             Any named  NET type  class  value type  enumeration  interface or delegate   can be referred to from within SML NET using the same syntax as in Cf  This  syntax works because of the interpretation of  NET namespaces as nested struc   tures  discussed above  For example     type XMLParser   string   gt  System  Xml XmlDocument       4 2 3 Array types samples arrays             Single dimensional  NET arrays behave almost exactly like SML arrays  their  size is fixed at time of creation  indexing starts at zero  equality is based on  identity not value  and an exception is raised on out of bounds access or up   date  Therefore the SML type constructor array corresponds to  NET   s type  constructor      But see Section 4 2 4 for a discussion of null valued arrays     The  NET exception System  IndexOutOfRangeException corresponds to  the SML exception Subscript    Some  but not all  array types inherit from the class System  Array  so you  can invoke methods on values of these array type and cast their array values    4 LANGUAGE EXTENSIONS FOR  NET 20    to and from class types  The restriction is that
21. SML NET User Guide    Andrew Kennedy  Claudio Russo  Nick Benton  Microsoft Research Ltd   Cambridge  U K     V1 2 build 1613 of Friday  02 June 2006    Contents    1 Introduction    1 1 About this document     L2 Grene asd Ge be a a a eal dg OS Ge  Lo  e ce ee a a he a a Oe a OD Oa eae Ee  amp   LA Mailing let   2  4 24444 ee bebe eee Rane dee a    Getting started   2 1 Requirements    ee a ek RO Oe EE SEE aa a a  22 AI Re Re  2 3 Configuration  Optional      lt cooccoccccocerar a 04  24 Example  Quicksort cnica iaa a  2 5 Demonstration programs    s i secs es e a e waa        000    Compiling programs   3 1 Command Syntaks o AAA de   3 2 Mapping of module identifiers to files                   3 3 Specifying a path for sources      saaara eaa  3 4 User defined mappings              a  oo Recompilabion o  4 4 4 44544460 008480444 be A  3 6  Exporting classes to NET    coco  ee ee es  3 7 Importing classes from NET               lt  lt         O CIDO aan ee GS oR A Pods RR 4  oo Shell commands       i4  44 5444445 4404 see dae d  3 10 Printing types and signatures                           OU o oe ke REA AE OR ele ee ee eee A  3 12 Additional assembler options                    0    3 13 Avoiding stack overflow         o    o    e      0005    ld CANNE AP io A A A A ee ERE  3 15 Command files and command line operation               3 16 Summary of Commands    o ee ee eae ee ca ee hs  3 17 Trouble with the  NET IL assembler ilasm exe               CONTENTS    4 Language exte
22. T distribution includes software which is Copyright   1989   1999 by Lucent Technologies  See the file SMLNJ LICENCE for details    The  entirely optional  SML NET binary distribution with Visual Studio  support includes additional software  the Visual Studio packages and an IL as   sembler  which is Copyright   2002 2003 Microsoft Research Ltd  See the addi   tional licence file MSR EULA for details  The alternative binary and source distri   butions  that exclude Visual Studio support  are NOT subject to the MSR EULA     1 3 Credits    The SML NET team is Nick Benton  Andrew Kennedy and Claudio Russo  The  compiler also includes code by George Russell  We would like to thank all the  others who have contributed code  support  web space  demos  test cases  gripes  and bug reports both to SML NET and to its precursor  MLj  Gavin Bierman   Tom Chothia  Stephen Gilmore  Dave Halls  Bruce McAdam  Chris Reade  John  Reppy  Peter Sestoft  the SML NJ developers  Ian Stark  Audrey Tan  Team  PLClub  Bent Thomsen  Lone Thomsen  Christian Urban     1 4 Mailing list    A mailing list for SML NET users has been set up  To join the list  send mail  to smlnet users request jiscmail ac uk  To view the archives of the list   see http   www  jiscmail ac uk lists smlnet users html     2 GETTING STARTED 6    2 Getting started    2 1 Requirements    Microsoft Windows  You can use any of Windows 98  ME  NT4 0  2000  XP  Home or XP Professional to run the compiler  We generally recommend  Windows
23. amespace MyLib   Executables must have an entry point  By default  the compiler looks for an  exported structure with a function called main or Main with one of the following    types     val main   unit   gt  unit  val main   unit   gt  int  val main   string option array option   gt  unit  val main   string option array option   gt  int    These types correspond to those accepted by the C   compiler for main        3 7 Importing classes from  NET reference  lib             In order to import classes from  NET libraries and code written in other lan   guages it is necessary to name the assemblies  roughly speaking  DLLs  that are  required  This is done using the reference command     reference libname        libname  The lib command   lib directory         directory    allows a path for searching for  dlls to be specified  SML NET follows the  same rules as C   in searching for assemblies     1  The working directory   2  The  NET system directory     3  The directories set by the 1ib command     3 COMPILING PROGRAMS 12    4  The directories set in the LIB environment variable     Many useful system assemblies are referenced by the config smlnet script  run from the bin directory when SML NET starts up  If you prefer not to  reference all of these  the minimal set of references actually required to compile  structures in the Basis is mscorlib d11 and System d1l        3 8 Output out  target  run  log             The compiler can be instructed to produce an executable   exe 
24. and  more usefully     let val r   ref  Pair 1 2   in r tinvert    r end     which returns the modified value Pair 2 1   are both legal  This works as  expected for fields too     let val r   ref  Pair 1 2   in  r  x     3  r end    returns the modified value Pair 3 2     This mechanism applies to all of the storage kinds of SML NET  see Sec   tion 4 7   By accessing fields or invoking methods on expressions of type   ty  kind reference  you can  if required  mutate  static fields of classes   mutable instance fields of objects and value types and even arbitrary addresses     4 5 1 Boxing and unboxing     NET provides a uniform object model  allowing any value of value type to be  viewed at type object  and thus stored in collection classes  etc    In detail   every value type has a corresponding boxed representation of proper class type  System ValueType and  by subtyping  System Object    Boxing a value allocates a new  appropriately tagged  object on the heap  and copies that value into the object  In SML NET  the boxed form of a  value type is obtained by an upcast  eg  p  gt System Object  to some suitable  CLR reference type  The supertype is typically System Object  but may be  System ValueType  Boxing casts work for primitive types too  eg  1  gt object    Unboxing an object extracts a value from a heap allocated object  but re   quires a dynamic type check   In SML NET this is achieved by a downcast from  some object type to a value type  For instance  for obj   Syst
25. ated when a class instance is created but  are accessible from the method declarations for the lifetime of the object  In  this example we have mimicked private mutable fields using ref bindings  x  and y   with initial values provided by arguments to the constructor  xinit  and yinit   The methods  which may be mutually recursive  as suggested  by the and separator   can refer both to these arguments and to the bindings  introduced by local    The ColouredPoint class derives from the Point class  passing two of its  constructor arguments straight on to its superclass constructor  It has no local  declarations and a new method that simply returns its colour    Because the declarations are local to the class instance  it is not possible to  gain access to the corresponding declarations for other instances of the class  In  C   private fields for other instances can be accessed directly  for example  to  implement an equals method  In SML NET  this can be emulated by providing  appropriate    get    and    set    methods for the fields           Direct mutual recursion between class declarations is not yet supported in this release   but can be simulated using forward declarations of abstract classes     4 LANGUAGE EXTENSIONS FOR  NET 33    structure PointStr    struct  _classtype Point xinit  yinit   with local  val x   ref xinit  val y   ref yinit    in  getX O    x  and getY       y  and move  xinc yinc     x     x xinc  y     ytyinc     and moveHoriz xinc   this  move  xinc
26. ckage     5 2 Requirements    The package requies the  NET Framework 1 0 or 1 1  1 1 is recommended for  debugging   and an edition of Visual Studio  NET 2002  2003 or 2005  other   wise known as versions 7 0  7 1 and 8 0  that includes C   support  such as  Professional or Academic editions  The Express editions of Visual Studio  NET  2005 are  unfortunately  not suitable     5 3 Installation    To install SML NET for Visual Studio  simply run the executable install exe  included in the distribution  By default  it installs the SML NET support   using the highest version of the CLR  for the highest version of VS currently  installed on your machine  Run install  help for more options that allow  you to override the inferred defaults  To uninstall  run uninstall bat or just  install exe  u     5 4 Working In Visual Studio    This section is a very brief guide to working with SML NET projects in Visual  Studio  NET     5 4 1 Opening an existing Project    The distribution comes with a sample Visual Studio Solution  This is a graphi   cal  multi language Game Of Life application  the user interface is written in Cf   project Client producing executable Client  exe  but the Game Of Life algo   rithm is written in SML NET  project Server producing library Server  d11     Start VS and open the sample solution file Life2002 s1n   Life2003 s1n  or Life2005 s1n  as appropriate for your version of VS  from  the directory vs demo Life in your distribution  You should be able to com   p
27. e state of NONE   gt  1   SOME s   gt   print s 0   end       3 3 Specifying a path for sources source             By default  the compiler looks for source files in the working directory  The  command    source directory         directory    specifies a comma separated list of directories to search for source files  The  directory names are normalized with respect to the directory current at the  time source is executed  and if source is already set then new directories are  appended  To display the current path type source   and to restore the default  behaviour  using the working directory  type source        3 4 User defined mappings structure  signature  functor             Sometimes it may be necessary to put SML entities in files not conforming to  the default naming conventions  In this case  you can define your own mapping  from structure  functor or signature identifier to filename  The commands    structure strid filename         strid filename  signature sigid filename         sigid filename  functor funid filename         funid filename    let you do this  The filenames are normalized with respect to the directory  current when the command is issued  and repeated use of the commands extend  the existing mapping    Multiple entities can be mapped to the same file  in which case the file must  contain top level module bindings for each of those entities    To find out what file a particular module maps to  whether through explicit  mapping or the source path and de
28. e they can use during execution  This can  pose a problem for some functional programs that rely heavily on deep  non tail  recursive call patterns    Fortunately  the Windows system utility editbin exe can be used to modify  an executable so that it demands a higher ceiling for the stack  For example    editbin  stack 100000000 Sort exe    sets a  huge  ceiling of ca  100MB  See the editbin documentation for more  details     3 14 Cleaning up    The SML NET compiler will cache information  assembly metadata  sml object  files and dependency information  in sub directory bin of the distribution and  subdirectories  smlnetdep and  smlnetobj of each directory on the source path    To delete this information  use the clean bat script  clean scrubs the ba   sis directories  everything cached in bin and in the current directory and its  subdirectories  Thus executing clean from C  gt  smlnet should return the dis   tribution to a pristine state    Use this script when you suspect the compiler has got itself confused  rare   but possible   With this release  we do not recommend you have more than  one SML NET process going at the same time  especially if the projects under  compilation share source code other than the basis        3 15 Command files and command line operation               A sequence of compiler commands can be collected together in a file name  sm1lnet  and then executed simply by typing  name  Inside name  smlnet the commands  must be separated by newlines  A sin
29. e types  Every value type derives from the base class  System ValueType  Value types are passed by value  or copying semantics  not  by reference    In SML NET  you can use the same syntax for accessing fields and invoking  methods on a value of value type as for objects of reference types  So for a    4 LANGUAGE EXTENSIONS FOR  NET 26    pair p  p  x    p  x   p  swap   are all legal  Method invocation works at  primitive types too  eg  1  ToString      In SML NET  invoking on a value type first copies the value  takes the ad   dress of the copy and then passes this address as the    this    argument of the  method  Similary  accessing a mutable field of some value first copies that value   This ensures that values are effectively immutable in SML NET  a basic require   ment for the implementation of a functional language  Thus p  invert   has  no effect on the value of p  nor does let val r   p  x in r    1 end  The  expressions do have side effects  but they cannot alter p    Some value types do have mutable semantics  perhaps employing mutable  instance fields that are updated by instance methods  Our copying semantics  implies that these updates cannot be observed  since they mutate a tempo   rary copy of the value  not the original value itself   To cater for such types   SML NET supports an alternative invocation semantics  In addition to invok   ing directly on a value  SML NET lets you invoke on any kind of SML NET  reference to a value type  Thus   ref p   invert   
30. eap  reference     classty  fieldname  static  used for a static field  this kind describes a sta   tic field by the name of the class and the name of the field      classty  fieldname  field  used for an instance field  this kind describes the  superclass of the object classty in which the field fieldname is defined   the sort of the class is enough to identify whether this is a field of heap  allocated  NET object or a field of a NET value type  C      struct    type      address  used to describe the address of a storage cell  An address can point to  the interior of an ML ref  to a static field  a stack allocated local variable   e g  from C    an instance field of a heap allocated object or an inlined  value type  Addresses are an abstraction of all of the above storage types     Bear in mind that storage cells of different kinds have distinct types and are  thus not type compatible  e g  it is a static type error to create a list containing  both an integer heap reference and an integer static field reference  because the  kinds of the references are not unifiable     Address kinds are used to describe the type of Cf call by reference ref and  out parameters  and typically occur in the  argument  types of imported meth   ods  Because an address can refer to a value on the stack  whose lifetime is  limited to that of its enclosing stack frame  values of address type and instance  fields of value types are subject to certain data flow restrictions  described in  detail in
31. edit  build  and debug SML NET projects from within the development environment   see Section 5 for an overview and additional installation instructions     Automatic dependency analysis  In either mode of compilation  the com   piler requires only the names of root modules and a place to look for  source code  It then does dependency analysis to determine which files  are required and which need recompilation     Produces verifiable CLR IL  The output of the compiler is verifiable MSIL   Microsoft Intermediate Language  for the CLR     Smooth interop with other languages on the CLR  SML NET extends the  Standard ML language to support safe  convenient use of the  NET Frame   work libraries and code written in other languages for the CLR  SML NET  can both consume and produce  NET classes  interfaces  delegates  etc   These extensions are discussed in full in Section 4     Whole program optimization  SML NET performs optimizations on a whole  program  or library  at once  It usually produces small executables with  fairly good performance     Its limitations are        Though this is an early release and the performance variation is very wide  Compared  with SML NJ  for example  some real programs go four times faster and some go ten times  slower     1 INTRODUCTION 4    No interactive evaluation  The interactive environment is for compilation  of stand alone applications or libraries only  SML expressions can not be  evaluated interactively and the use command is not availab
32. een  SML and  NET as values of an option type  For example  the method Join in  class System String has the C  prototype     public static string Join string separator  string   value      This maps to an SML function with signature    val Join   string option string option array option  gt string option    4 2 5 Interop types    We will use the term interop type for the types described in the previous sections  and new  NET types defined inside SML NET code  Interop types can be used  in SML extensions such as casts  overloading  implicit coercions  and  with  additional restrictions  in exported structures    A special case of an interop type is an interop input type  Input types  describe values that might be passed into SML NET from external  NET classes   and therefore must assume the possibility of null values for reference types    To be precise  an interop type is one of the following     1A NET value type  primitive or struct    Examples  int  System DateTime     4 LANGUAGE EXTENSIONS FOR  NET 21    2  A  NET class  interface or delegate type defined externally or from within  SML NET code by _classtype or _interfacetype  see Sections 4 8 1  and 4 8 3   Examples  string  System  IEnumerable  System EventHandler     3  An array whose element type is an interop input type  Examples  string  option array  System DateTime array     4  Possibly null versions of either of the above  Examples  string option  array option  System EventHandler option array option     A type i
33. em Object  the  expressions obj   gt Pair and obj  gt  int unbox the underlying value  returning a  value  Note that  like any other downcast  these involve a dynamic test and can  fail  raising System  InvalidCastException     4 5 2 Null values    In SML NET  every non primitive value type has an implictly defined null  value  bound in the structure of that same name  eq  Pair null is equivalent to    4 LANGUAGE EXTENSIONS FOR  NET 27    Pair 0 0    The null value is provided in case the value type has no associated   NET constructor  it can be used to initialise a reference prior to setting up its  state  For example     let val r   ref Pair null  in   r  x      x   y   Ir    Ls  2     end    returns the value Pair 1 2   but without calling a constructor           4 6 Enumeration Types samples enums          In  NET  an enumeration type is a distinct value type  declared with a set of  named constants of that type  Every enumeration derives from proper class type  System Enum  Each enumeration type has an underlying  signed or unsigned   integral type  equivalent to one of the SML NET types IntW  int or WordN  word  for N      8  16  32  64     In SML NET  a  NET enumeration type is imported as a pseudo datatype of  the same name  The datatype has a single  unary constructor  named after the  type  that constructs an enum from a value of the underlying type  The named  constants of the enumeration are imported as equivalently named constant con   structors  abbreviating par
34. fault naming convention   use the commands     structure strid   signature sigid   functor funid        3 5 Recompilation make   remake             When a source file is changed and make or remake is invoked  SML NET will  recompile that file and  if necessary  any other files that depend on it  This  propagation will only happen if the result of elaborating the entity has changed    3 COMPILING PROGRAMS 11     in essence  its type   If a recompiled structure matches an unchanged signature  then no modules which depend on it will be recompiled    Command make compiles the current project  but links and assembles only  if the sources have changed or the target does not exist    Command remake compiles the current project  but re links and re assembles  even when the sources have not changed and the target already exists        3 6 Exporting classes to  NET export  main             The export command indicates to the compiler which top level SML structures  are to be exposed as public classes in the compiled executable or library  The  syntax of export is the following     export strid  classname         strid  classname     By default  structures are exported as top level classes with names match   ing that of the SML NET structure  For example  the command export S  M  generates two public classes S and M  These names can be overridden  typically  to introduce a namespace  For example     export S MyLib Classi  M MyLib Class2    will produce two classes Classi and Class2 in n
35. g program development  It is particularly convenient for checking how  SML NET views libraries written in other languages     3 COMPILING PROGRAMS 13       3 11 Options on  off                There are a large number of compiler options available  They are turned on  and off using on option and off option and can be queried using option     Alternative syntax  option  or just option to enable  and option  to disable    We document the most useful options here     debug Emit debugging information  default  off   If enabled  some symbol and  line number information is generated in the assembler file  and the  debug  option is passed onto the  NET assembler     debug exnlocs Exception line number information  default  on   If enabled  the compiler  will insert appropriate code into the output so that when SML exceptions  appear at top level the runtime reports the SML structure and line number  where the exception was raised     debug symFromLoc Emit truncated source expressions as the symbolic names for their values  in debug builds  default  off   This can be useful for viewing the values  of intermediate expressions when debugging     sml seqwithtype Sequential withtype declaration  default  off   The Standard requires  that multiple bindings in the withtype clause associated with datatype  declarations are interpreted simultaneously  It is arguably more useful to  interpret them sequentially  as does SML NJ     warn value Non generalised type variable warnings  default  on  
36. g to CLR  libraries and for implementing new CLR classes inside SML  Section 5 docu   ments the Visual Studio  NET support package        2For programs that make no use of the language extensions it is possible to develop and  test them using a compiler such as Moscow ML or Standard ML of New Jersey and then to  use SML NET to produce final executables     1 INTRODUCTION 5    1 2 Licence    SML NET COPYRIGHT NOTICE  LICENCE AND DISCLAIMER    Copyright   1997 2003 by the University of Cambridge   Permission to use  copy  modify  and distribute this software and its doc   umentation for any purpose and without fee is hereby granted  provided that  the above copyright notice appear in all copies and that both the copyright  notice and this permission notice and warranty disclaimer appear in supporting  documentation  and that the name of the University of Cambridge not be used  in advertising or publicity pertaining to distribution of the software without  specific  written prior permission    The University of Cambridge disclaims all warranties with regard to this  software  including all implied warranties of merchantability and fitness  In no  event shall the University of Cambridge be liable for any special  indirect or con   sequential damages or any damages whatsoever resulting from loss of use  data  or profits  whether in an action of contract  negligence or other tortious action   arising out of or in connection with the use or performance of this software    The SML NE
37. gle command can be split over several lines  provided that the splits occur following commas  This is useful for commands  that specify lists of items    The special command file config smlnet  located in the compiler bin direc   tory  is interpreted when the compiler is run  It is a useful place to set options  appropriate to all projects    It is also possible to execute compiler commands directly from the command  line  either before entering the compilation environment  to set options such as  source  for example  or without entering the environment at all  to build an  executable  for example   Simply precede the command names with hypens or  slashes  and separate the command from its arguments by a colon instead of a  space  Identifiers at the end of the line are interpreted as inputs to an implicit  make  if any make occurs at all then the compilation environment is not entered   For example     C  smlnet gt smlnet  source demos sort Sort    will compile our quicksort example to produce a file Sort exe  and    3 COMPILING PROGRAMS 15    C  smlnet gt smlnet  verbose  will enter the compilation environment in verbose mode     3 16 Summary of commands    help command  help  command    command     command  help     Displays command list or more detailed help on a particular command     type longid   type  longid  Displays type signatures for entities with name longid  values  types  structures   and signatures      source directory         directory  source  directory     
38. hese interact unpleasantly with type inference  our intention is to  have typing rules and an inference algorithm such that a program is accepted  iff there is a unique resolution of all the method invocations  with respect to  the rules   Use of the    most specific    rule during inference can lead to type  variables becoming bound  and hence ambiguities far from the point of the  rule   s application being resolved in unexpected ways        4 5 Value Types samples valuetypes              NET provides support for an extensible set of unboxed  structured values called  value types  C    s structs   Consider the C   declaration of lightweight  integer  pairs     public struct Pair    public int x     mutable      public int y     mutable         constructor     public Pair int i int j  x   i  y   j       functional swap  returns a new pair     public Pair swap   return new Pair y x        destructive swap  modifies    this    pair     public void invert   int t  t   x  x   y  y   t  return      Value types  like ordinary classes  can have fields and instance methods   However  because value types are sealed  cannot be subclassed   they do not  need to be boxed on the heap  otherwise used to provide uniform representa   tions   nor do they need to carry run time type descriptors  used to support  checked downcasts and virtual method invocation   For the most part  you can  view instances of value types as structured primitive types  Indeed  primitive  type such as int are valu
39. ile the solution out of the box  choose Build   Solution  To run the solution   you may need to first manually set the startup project to be the C  Client  project  For some reason  VS sometimes assumes that the startup project is  the Server library  but this is a  d11 and cannot be run   One way to set the  startup project  in the Solution Explorer Window  right click on the Client  and select Set as Startup Project  Now choose Debug   Start to run the  application  You should see a small Life application window appear  in the  application  select File   Go to start the animation    After running the project  try editing file Server  sml in the Server sources   The SML code should appear in colour in the editor window  If not  something    5 VISUAL STUDIO  NET SUPPORT 40    went wrong with your installation  Edit the code  any syntax errors will be  underlined with red squigglies  and displayed in the Task List   After you have  have built the project at least once  you will be able to use Intellisense on SML  identifiers  see type and build errors in the Task List window  set breakpoints  in the margin of source code  etc  Note that Intellisense will only work if the  source file participated in the most recent build  Also  Intellisense will only  work against libraries referenced in the most recent build    The file Server  sml contains some comments suggesting things to try in the  Visual Studio editor  See the Visual Studio Documentation for more details on  using the V
40. isual Studio Editor     5 4 2 Creating a new Project    Start Visual Studio  NET  Choose File gt New gt    Project      In the New  Project dialog box  supply a name and location for your new project  In the  Project Types pane  open the folder SML NET Projects  In the Tem   plates pane  double click on the SML NET Application icon   The other  icon selects a library  or  d11  project   This should create the new project    Now select View   Solution Explorer You should see a new tab with an  SML NET project  the icon actually says it is a C   project  but never mind    Click on the name   sm1 file in the Solution Explorer tab  If it appears in the  editor with coloured syntax  all is well    You can now build  Build   Build Project  and run  Debug   Start  the  project  When run  the skeleton application does nothing but exit    New source files may be added to the project by choosing  Project   Add New Item      providing a name for the file  expanding the  Visual C   tree    selecting the SML NET subtree  and then selecting the  appropriate SML Template    Every new project includes an SML NET script  script  smlnet  as a project  item  This script is passed to the batch compiler in both debug and release builds  and should be used to set any additional compiler options  like referencing ad   ditional assemblies  including additional SML source directories  etc    For example  to reference the assemblies in files filename        filenamen  add the following line to script 
41. le        Whole program optimization  Top level SML modules are not compiled in   dividually to  NET object code  Instead  some compilation takes place on  separate modules  type checking  translation to the compiler   s own inter   mediate form  and some optimizations  but most is deferred until after  the linking together of top level modules  This improves performance of  the generated code  but significantly increases  re compilation times  To  give a rough idea  it takes a couple of minutes to recompile a 25 000 line  SML application on a 1 33GHz Athlon with 512MB of RAM     Only CLR types at boundaries of compiled code  The exposed interfaces  of applications or DLLs compiled by SML NET may only refer to CLR  types  classes  interfaces  delegates  etc    They may not expose SML   specific types  functions  datatypes  records  etc    In particular  this re   striction means that one cannot compile an arbitrary SML module into  a DLL for consumption even by other SML NET programs  the module  must be either linked into the client program at compile time or use only  CLR types at its interface     1 1 About this document    This guide is aimed at programmers already familiar with SML  The textbook  by Paulson  3  is an up to date introduction to SML   97    Section 2 describes requirements  installation  and takes you through the  compilation of a simple program  Section 3 presents the compilation environ   ment  Section 4 describes extensions to Standard ML for interfacin
42. le  containing a component of byref type     e A method may take a single byref as an argument  and may also take a  tuple containing a component of byref type        4 Aside from these restrictions  addresses can be passed to other methods  supporting  Pascal style call by reference passing of local variables     LANGUAGE EXTENSIONS FOR  NET 31    A function or method may not return values of byref type     When matching a structure to a signature  the implementation of any  opaque type in that signature may not be a byref type     A byref type may not be used as the type of an argument to an SML NET  class constructor or as the type of any value bound in the optional local  declaration of an SML NET class declaration  This restriction will be  lifted in a later release of the SML NET compiler     Finally  to ensure the above properties are preserved by SML   s type in   stantiation of polymorphic values and parameterised type constructors   type arguments  whether explicit or inferred  cannot be byref types  nor  may they be kinds describing byref types  Exceptions to this rule         and  amp   which are known to be safe  may be instantiated at kinds describing    byrefs        4 8 Defining new  NET types    4 8 1 Class declarations             samples classtype       The mechanisms described so far give the SML programmer access to  NET  libraries  but they do not support the creation of new class libraries  nor do  they allow for the specialisation of existing  NET clas
43. ler used  by SML NET  the debug information in an IL method can be associated with  at most one source file  In SML NET target code  due to inlining  a target  method will often be associated with more than one source file  To avoid the  assembler bug  SML NET prefers to use its own version of the assembler in  bin ilasm exe  If  for some reason  this private ilasm exe does not work  on your machine you can simply delete it from the bin directory  In that  case  SML NET will use the ilasm from your  NET Framework installation   In addition  as a less satisfactory workaround  in debug mode  SML NET will  produce a dummy source file  with extension   m1  containing the concatenation  of all sources referenced from the executable  It is this dummy file  not the  original code  that is referenced by the debugger and should be used for setting  breakpoints  but this can be rather confusing to the user     The executable bin ilasm  exe is Copyright   2002 2003 Microsoft Research  Ltd  and is covered by a separate licence in file MSR EULA  If you are not happy  with the terms of this licence  simple delete the executable bin ilasm exe     4 LANGUAGE EXTENSIONS FOR  NET 18    4 Language extensions for  NET    A significant aspect of the SML NET compiler is its support for seamless inter   operation with other  NET languages and libraries  The approach taken is the  following     e Where possible  map  NET features into equivalent SML features  For  example  static methods are mapped 
44. ns  For example     val adder   Binary0p op      To actually apply a delegate to some arguments  you simple use its  virtual   Invoke method     4 LANGUAGE EXTENSIONS FOR  NET 22    val 3   adder  Invoke 1  2     Every delegate has an implicitly defined Invoke method  C   actually employs  syntactic sugar that calls this method under the hood     Delegates are reference types with base class  System MulticastDelegate  Thus they come equipped with a suite of meth   ods  beyond the crucial Invoke method discussed here  see the  NET documen   tation         4 3 3 Casts and cast patterns samples casts             A new syntax is introduced to denote C  style casts           exp   gt  ty          It can be used to cast an object up to a superclass     open System Drawing  val c   SolidBrush System Color get_Red      gt  Brush    Explicit coercions are sometimes required when passing  NET objects to SML  functions and constructors  as coercions are only applied implicitly when invok   ing  NET methods    The same syntax can also be used to cast an object down to a subclass   with System  InvalidCastException thrown if the actual class of the object  is not compatible  A safer alternative that combines downcasting with C    s is  construct is the use of   gt  inside SML patterns              pat   gt  ty       This can be used to provide a construct similar to type case found in some  languages  For example  this code from demos xq Xmlinterop sml switches  on the type of an XmlNode 
45. nsions for NET  4 1 Namespaces  classes and nesting       o               42 WY PGR  sss eR ew ee Boe Re EH e  AQ Bulta types  oo ek ee data 8  42 2 Named NET types    00 5 2 4 200 84484 Sods  ALS o AN  424 Nul values ociosos  ttm ic a es  AO    Aerop YPES caca a a ees a he oS  Ba IES  cos a EEE A a ala  43 1  Creating objects 2 2 44 66244 aaa eR ae  4 3 2 Creating and invoking delegate objects              433 Caste md Cast patterns psa ci ee a ee K  4 4 Fields  methods and properties                      AAA Bid oc babda Be ES A a  aa Methods  ss 44 a surea eee be A oe ee eh te    4 4 3 Overloading and implicit coercions                AD Valle Types  o a aw a a a ee ae a ee Se ES  4 5 1 Boxing and unboxing    2    0 2 62 eee eae  A52 Nal Vanes  spa oe hee EE a ee Ra ow  4 6 Enumeration Types  s saae a d a 86048444  4054 8464  AT Storage Types  o aas eama aada Ge Me HB Bow e x  Anl Storage kinds     2 44 4 465444 cee be ye eee a  4 7 2 Address operators   amp             o             aie Byret types  cs esaea aeter ag aaa a    4 8 Defining new  NET types                             4 8 1 Class declarations                2     0045  4 8 2 Class types and functors        e es   e ssr oaao wata  43 3 Interface declarations  lt  c socos oci eaaa aau 2246  4 8 4 Delegate declarations                  a a  49 Custom Attributes o s s sacs a eR OD e RRA  4 10 Exporting structures    200 a a aa a de obs  5 Visual Studio  NET Support  Bl ACEROS ea dag aa hw ra ER Boe el is a ave es
46. ort   This will provide a convenient way to define classes with both instance and  static methods  thus mirroring the semantics of class import     5 Visual Studio  NET Support    Depending on your choice of download  your distribution may include an exper   imental Visual Studio  NET package for SML NET  This package extends the  Visual Studio Development Environment with SML specific editor and project  support  Installation of this package is optional and at your own risk    The SML editor provides code colouring  bracket matching  syntax checking   Intellisense on both  NET and SML NET libraries and even interactive type  inference     An SML NET project is just a C   Makefile project that invokes  the SML NET batch compiler  It can participate in Visual Studio multi project  solutions  The package includes simple wizards for creating new SML NET  projects and project items  As usual  a project may be built in a Debug or       11 All implemented in a pure SML NET  masquerading as a classic COM component     5 VISUAL STUDIO  NET SUPPORT 39    Release configuration  Debug executables may be run under the Visual Studio  source code debugger  Although by no means perfect  the debug experience has  improved substantially over SML NET 1 1 and is worth another visit     5 1 Licence    The Visual Studio package is Copyright   2002 2003 Microsoft Research Ltd   and is covered by a separate licence in file MSR EULA  Please take the time to  read the licence before installing the pa
47. pe BinaryOp of  int int   gt int    This simultaneously declares the type constructor BinaryOp  the  higher   order  class constructor val BinaryOp    int int    gt  int    gt  BinaryOp  and the implicit Invoke method of type  int int   gt  int    Unlike ordinary SML function types  delegates can be exported in the sense  of Section 4 10  providing a rudimentary way of inter operating at the level of  first class functions        4 9 Custom Attributes samples attributes             SML NET  like C    enables programmers to use and declare new forms of cus   tom meta data using attribute classes  Programmers can annotate SML NET  code with instances of attribute classes  whether these classes were imported  or declared within SML NET itself  These attribute values may be retrieved at  run time using reflection    The standard example is that a framework might define a  HelpAttribute attribute class that can be placed on certain program elements   such as classes and methods  to provide documentation displayed in meta data  aware class browsers    Here s a simple attribute class defined in Cf     public class CSharpAttribute   System Attribute    public CSharpAttribute       public string Property      set         public string Field   null          In SML NET  a new attribute class is defined by declaring a class that ex   tends System  Attribute  eg     4 LANGUAGE EXTENSIONS FOR  NET 36    _classtype MLAttribute s string option   System  Attribute    with ToString      s end 
48. pes samplesl references             Standard ML has a minimalist type system that supports only one kind of  mutable storage cell  ty ref  with the following interface     type ty ref   val ref   ty   gt  ty ref   val     ty ref   gt  ty   val       ty ref   ty    gt  unit    Operationally  the expression ref exp evaluates exp of type ty to some value v   allocates a new object containing a single field storing v on the heap and returns  a handle to that object of type ty ref    and    read and write the contents of  the field  References have identity and may be tested for equality using SML   s  equality predicate           a         a    gt  bool    SML NET compiles values of type ty ref to an instance of a private class  with a single mutable instance field of type ty  However  the CLR provides  a much wider range of mutable structures  static fields of classes  instance  fields of heap allocated multi field objects and instance fields of stack allocated  value types  The CLR even provides a general address type to support call by   reference parameter passing  C    s ref and out parameters   For interoperation  with  NET libraries  SML NET has to support these kinds of storage as well    In SML NET  all of these types are described as particular instantiations of a  more general type constructor   ty  kind  reference  Unlike SML   s ref type  constructor  this type constructor takes two type parameters  The first simply  describes the type of the value stored in the cell
49. pplication should break into the VS source code debugger  The call stack  will probably contain a mixture of Cf and SML NET stack frames  Clicking  on stack frames will take you to the relevant source code  You can even step  through the program  including stepping through SML NET source code and  inspecting SML NET bindings  in their raw  compiled form  on the stack    Although the situation has improved  the SML NET compiler does not al   ways produce enough debug information  control flow  data representations   identifier names and source locations are frequently altered or obscured by the  various optimisations in the compiler  Even so  the information that does remain  can still be useful in tracking down bugs    From version 1 2 of the compiler  bindings in the Locals window now enter  and exit scope appropriately  The values of  truncated  sub expressions  not  just identifiers  may be reported as locals in the Locals window  provided you  rebuild your sources with compiler option on debug symFromLoc  this is off by  default     In debug builds  constructed values now have a symbolic tag field derived  from the constructor name  SML NET stack frames displayed in the Call Stack  will mostly have meaningful  not mangled  source names    As a convenience  values of heap allocated SML types  such as tuples  records  and non flat datatypes  now support additional diagnostic ToString   and  ToString int depth  virtual methods that can be invoked in the VS Im   mediate windo
50. r   separator  int count      Its type is interpreted as    val Split   char array option   int   gt  string option array option    and can be called using an ordinary function application     fun split c char array i int    val0f System String Split  SOME c  i      Here is an example of instance method invocation        Create an object      val xmldoc   Xml1Document         Invoke an instance method on it     val _   xmldoc  Load filename     4 LANGUAGE EXTENSIONS FOR  NET 25       4 4 3 Overloading and implicit coercions samples  overloading              NET permits the overloading of methods  the definition of multiple methods  with the same name within a single class  The methods are distinguished by  their argument types  Furthermore  C  and other languages support implicit  coercion of arguments in method invocations  The combination of these features  can lead to ambiguity  which Cf resolves statically by picking the most specific  method with respect to an ordering on argument types  rejecting a program if  there is no unique such method    SML NET allows implicit coercions on method invocation using C    s ref   erence widening coercions together with an additional coercion from T to T  option for any  NET reference type T  We do not allow C    s numeric widening  coercions to be implicit as the    spirit of SML    is to use explicit conversions such  as Int64 fromInt for these    We do not allow ambiguity to be resolved by C  style most specific method  rules  as t
51. r distribution to a path  that does not contain spaces  eg  C  smlnet but not C  Program Files smlnet   We hope to lift this restriction in a future release    On Windows 98 and Windows ME  if the compiler is installed somewhere  other than C  smlnet then you must also set SMLNETPATH to that directory     2 3 Configuration  Optional     SML NET is designed to support multiple versions of the  NET Framework   as determined by the values of two environment variables  FrameworkDir and  FrameworkVersion  If these variables are undefined  SML NET will infer their  values by running the helper program bin getsysdir exe  When defined   FrameworkDir should specify the machine   s installation directory for all ver   sions of the  NET Framework  and FrameworkVersion the particular version of  the  NET Framework that you wish to target  FrameworkVersion must name  a subdirectory of FrameworkDir   Typical settings might be     set FrameworkDir C   WINDOWS Microsoft  NET Framework  set FrameworkVersion v1 1 4322    2 GETTING STARTED 7    WARNING  It is strongly recommended that you clean your project when   ever you change to a different version of the  NET Framework  See Section  3 14     NB  the Framework environment variables are pre defined when you start a  Visual Studio  NET 200x Command Prompt  so running SML NET from  the shell will automatically target the correct  NET Framework for that version  of Visual Studio     2 4 Example  Quicksort    To test its operation on a demonstra
52. ries for ML Yacc are in directory  smlnet lib parsing and if you wish to incorporate code which has been gener   ated by ML Yacc into your project you simply have to place this directory on the  SML NET source path and execute the smlnet lib parsing sources smlnet  script to map the required module names to the files in this directory  see the  xq demo for an example of how to do this   The ML Lex and ML Yacc tools  themselves can be found in the demos directory  though if you already have  the SML NJ versions  there s no particular advantage in running the  NET  executable versions    Separately  the smlnet lib smlnj lib smlnet script predefines a mapping  from module names to file names that lets you easily use some of the SML NJ  utility libraries  typically under sm1 src smlnj 1lib Util  but the precise lo   cation depends on your SML NJ installation   This mapping is incomplete in  the current release     References     1  E  R  Gansner and J  H  Reppy  editors  The Standard ML Basis Library  reference manual  Cambridge University Press  to appear  In preparation   online reference available at  http    www standardml org Basis index html     REFERENCES    44          Structure Omissions and discrepancies   top level no use   Array none   BinI0O no getPos   setPos   no functional I O  Bool none    BoolVector BoolArray  Char WideChar  CharVector WideCharVector  CharArray WideCharArray  CommandLine   Date   General   IEEEReal   Int Int32   Int8  Int16  FixedInt Largelnt 1n
53. ring option   For the most part  mutable fields can be treated as if they had SML ref    types  they can be deferenced using   and assigned to using     So fields  declared by  class C      public static int counter     static  public int size     instance         can be used as if it is an SML reference cell whose contents have type int  For  example     C counter     C counter   1  fun size  x C      x  size     In fact  mutable fields are given special types that are a generalization of  Standard ML   s ref type constructor  see Section 4 7     Every mutable field also gives rise to a type binding of the same name  You  should think of this as a new kind of SML reference type  in reality  it just  abbreviates a particular storage type describing this kind of field  see Section  4 7      val counterRef   C counter   C counter  valc  C      val sizeRef   C size   c  size       4 4 2 Methods samples methods              NET method types are interpreted as follows  First  void methods are con    sidered as having unit result type  similarly methods that take zero arguments   have unit argument type  Second   NET supports multiple arguments directly   but SML does not  so methods with multiple arguments are given a single tuple   argument type  Finally  when arguments and results are objects or arrays  their   types are interpreted using the option type constructor as described earlier   Consider the following method from class System String     public static string   Split cha
54. rue     gt  false    4 4 Fields  methods and properties    Static  per class  fields and methods are mapped to value and function bindings  in SML located in the structure corresponding to their class  For example  the PI  static field in the System Math class  accessed from C   using System Math PI   maps to a value binding for PI in the SML structure System Math accessed  using the same syntax  Likewise  the Cos static method in the same class is  mapped to a value binding of Cos in the structure System  Math    Non static  instance  fields and methods are handled specially through new  syntax for field access and method invocation        exp   name             Here exp is an SML expression with a  NET object type  and name is the name  of an instance field or method    Properties are really just Cf syntactic sugar formalizing the commonplace     set  set    design pattern  No special support is provided in SML NET  so they  must be accessed through their underlying methods which have the names get_P  and set_P for a property called P    We now describe how field and method types are mapped into SML        4 4 1 Fields samples fields             Immutable  NET fields  readonly and const in C    are given types as explained  in Section 4 2  using option to denote the possibility of null values for objects  or arrays  For example  a field declared in Cf using    public static string language_name    C       4 LANGUAGE EXTENSIONS FOR  NET 24    is interpreted as having type st
55. s a value type  not a proper class  type   belong to this second category  In SML NET  these are collectively called  byref types    In the CLR  an address can  amongst other things  be the address of a value  allocated on the call stack  e g  an imported address of C    local variable   or  the address of a field of a value on the stack  e g  an imported address of a  field of a C   local variable   Such an address is only valid for the lifetime of  the stack frame from which it was taken  To prevent such ephemeral addresses  from being read or written outside their lifetime  when they are unsafe dangling  pointers   the CLR imposes restrictions on values of address type  they cannot  be stored in static fields or instance fields of CLR values or objects    Because  SML NET s byref storage types compile to CLR addresses  which must obey  the CLR   s rules  byref values and types can only be used in limited ways  In  detail  SML NET imposes the following restrictions     e A value of byref type must not occur as a free variable of any function or  class declared within its scope  this includes anonymous functions      A byref type cannot be used as the argument type of a datatype or ex   ception constructor     A tuple  or record  cannot contain a field of byref type  unless that tuple  is the immediate argument to a method or constructor     A structure expression may not export a value of byref type     A function may take a value of byref type as an argument  but not a tup
56. s an interop input type if it is one of  1  or  4  above     4 3 Objects       4 3 1 Creating objects samples new             In Cf  instances of a class are created using the syntax  new class arg       arg       where arg  are the arguments to one of the constructors defined by the class   We avoid the need for any new syntax in SML NET by binding the class  name itself to the constructor function  If there is more than one constructor   then the binding is overloaded  see Section 4 4 3    Constructors can be used as first class values  and implicit coercions are  applied using the same rules as for methods  see below   For example     val fonts    map System Drawing Font    Times   10 0     Garamond   12 0         4 3 2 Creating and invoking delegate objects samples delegates             NET and Cf support a kind of first class function called a delegate  A delegate  object is an instance of a named delegate type that wraps up a method and  in  the case of instance methods  its context  Delegate types are mapped to two  SML bindings  the type itself  just as with class types  and a function binding  for the delegate constructor  which takes an SML function as its only argument   For example  suppose that the following delegate type was declared in Cf     public delegate int BinaryOp int x  int y      This is reflected as an SML type BinaryOp and a function with signature  val BinaryOp     int int   gt int    gt  BinaryOp  used to construct delegate objects from SML functio
57. s decided to diverge from the  standard and to raise no exception  If there is sufficient interest  a future release  may include a special version of the Basis in which Overflow is raised  Even  so  this would probably best be used to track down bugs  for instance  turning  an infinite loop into an uncaught exception  and not relied on for production  code     A 2 Non uniform datatypes    The SML NET compiler imposes the restriction that occurrences of parame   terised datatypes within their own definition are applied to the same type ar   guments as the definition  In any case datatypes such as    datatype    a Weird   Empty   Weird of     a    a  Weird    are of limited use in the absence of polymorphic recursion   This restriction will be lifted in a future release of the compiler     A 3 Value restriction    The definition of SML    97 specifies that the types of variables in bindings of the  form    val pat   exp    are generalised to allow polymorphism only when exp is a syntactic value  non   expansive expression  2  Section 4 7    SML NET makes the further restriction  that generalisation can only occur if pat is non refutable  that is  a match will  always succeed and not raise the Bind exception   An example of a refutable  binding is val  x    nil  nil   This restriction is also applied by SML NJ  version 110 xand it can be argued that it is an omission from the Definition    SML NET also prevents generalisation when pat contains ref patterns  This  second restric
58. ses with new methods  coded in SML  For this we introduce a new construct whose syntax is shown       below   dec    _classtype   attributes    Lemod    attributes     class name pat    superdecs   with  local dec in    methoddecs   end  superdec    ty   ty exp  superdecs      superdec   superdec   superdecs  methoddec       attributes      mmod   method name pat   exp      attributes     mmod  method name   ty  methoddecs     methoddec   methoddec and methoddecs          This introduces a new class type class name defined by the following ele     ments     e The optional  and typically absent  attributes  and attributesa list any  class or constructor attributes  see Section 4 9         e The optional class modifier in cmod can be abstract or sealed and has  the same meaning as in Cf        5In SML NET  the values          and  amp  should not be rebound by the user  but this is    currently not enforced by the compiler     You must explicitly write a  possibly  empty  emod  phrase to indicate any constructor  attributes  this avoids ambiguities in the grammar        4 LANGUAGE EXTENSIONS FOR  NET 32    e The expression class name pat acts as a    constructor header     with pat  specifying the formal argument  or tuple of arguments  to the constructor   Any variables bound in pat are available throughout the remainder of the  class type construct     Unlike C   multiple constructors are not supported  a future enhancement  might allow additional constructors to be expressed
59. smlnet   reference filename        filename     Under VS2003 and higher  the project tree will also contain a References  node  but it is completely ignored by SML NET and should not be used to  reference assemblies      To include additional SML source in directories dirname        dirname   add the following line to file script smlnet   source dirname        dirnamen   Each project also includes with a README html file with some hints and  handy links to the online SML Basis documentation  which you can browse  within VS  and the online SML NET manual  also included in the distribution     Note that you can easily customize the project Build  Rebuild and Clean  actions by editing the project   s properties  select the NMake property subtree  and edit the NMake command line properties        12SML NET projects masquerade as C   makefile projects     5 VISUAL STUDIO  NET SUPPORT 41    5 4 3 Debugging    SML NET is able to produce symbolic debug information for use by the Vi   sual Studio Debugger  and other CLR debuggers such as the free source code  debugger available in the NET SDK     For some entertainment  open a Life solution  select the Debug configura   tion  Build     gt Configuration Manager      gt Debug   and build the solution  again  see Section 5 4 1   Now set a breakpoint by clicking the grey margin in  some SML file  some good locations are marked   BREAK   in file Server  sm1    Run the application by choosing Debug   Start  After selecting File   Go   the a
60. solve overloading  constant values  must be literals or values immediately constructed from literals  of the follow   ing SML NET types     string  and string option   char  bool  Word8 word   Int16 int  int  Int64 int  Real32 real  real  any imported enumeration  type  or System  Type       The precise grammar of attribute expressions is given below        attributes      atterpseq    attexp    exp  where namedargs end    attexpseq    attexp   atterp   attexpseq  namedarg     fieldname  exp   propertyname exp  namedargs     namedarg   namedarg   namedargs                   The supported attribute argument types are the ones required by the CLS   NET   s Com   mon Language Subset    l0system Type arguments are not supported in this release     4 LANGUAGE EXTENSIONS FOR  NET 37    Imported attribute classes will typically have named as well as positional  parameters but attribute classes declared in SML NET can only ever have po   sitional parameters  corresponding to the arguments of the  sole  class con   structor  This is simply a consequence of our design  SML NET   s _classtype  declarations cannot explicitly declare named fields or properties    In the current release  attribute expressions may only be placed on classes   class constructors  methods  interfaces  interface methods  delegate classes and  delegate constructors  C   provides rather more places for attributes  most no   tably assembly and parameter attributes  if there is sufficient demand  we may  extend SML
61. structure bindings for nested  classes     For example  within the namespace System  Threading  reflected as a struc   ture Threading inside a top level structure System  the class Mutex is mapped  to an SML type identifier Mutex  to a value identifier Mutex  and to a structure  Mutex    Namespaces and classes interpreted as structures can be manipulated like  any other structure in SML  they can be rebound  constrained by a signature      passed to functors  and opened    Opening of namespaces as structures through open is analogous to Cs using  construct  However  when used with classes as structures the open mechanism  is more powerful  permitting unqualified access to static fields and methods   Also  nested namespaces become visible as structures        3This is not supported in the initial release    4 LANGUAGE EXTENSIONS FOR  NET 19                    NET type C  type SML NET type  System Boolean bool bool  System Byte byte Word8 word  System Char char char  System Double double real  System Single float Real32 real  System  Int32 int int   System  Int64 long Int64 int  System  Int16 short Int16 int  System SByte sbyte Int8 int  System String string string  System UInt16 ushort Word16 word  System UInt32 uint word  System UInt64 ulong Word64 word  System Exception   System Exception   exn  System Object object object          Table 1  Correspondence between types in  NET and SML NET    4 2 Types       4 2 1 Built in types samples builtintypes             Table 1 lists 
62. t64  Int N Vector Int N  Array  10   List   ListPair   Math   Option   OS   0S FileSys   0S Path   0S Process  Real Real64   LargeReal  RealVector RealArray  String WideString  Substring WideSubstring  TextI0   Time   Timer   Vector   Word Word32   Word8  Word16  LargeWord Word64  Word N Vector Word  N Array          none  Char maxOrd   65535   none   none   none   none   extended with  amp  type and operation  setRoundingMode only accepts TO_NEAREST             div  quot  abs don   t raise Overflow  as above   as above   none   none   none   none   none   none   none   tmpName creates a file  no access with A_EXEC  none   system doesn t do console I O   no fromDecimal  toDecimal   none   none   none   no getPos   setPos   no functional I O  none   only wall clock time is measured   none   none   none   none   none       Table 2  Basis structures implemented in SML NET       REFERENCES 45     2  R  Milner  M  Tofte  R  Harper  and D  MacQueen  The Definition of Stan   dard ML  Revised   MIT Press  Cambridge  Mass   1997      3  L  C  Paulson  ML for the Working Programmer  Cambridge University  Press  second edition  1996     
63. the constructor argument is either unit  an exportable  input type  or a tuple of exportable input types  as for functions          The methods all have exportable types  as for functions      e A type is an exportable type if it is an interop type  see Section 4 2 5   that does make not use of non exported class  interface or delegate types   A type is an exportable input type if it is an interop input type  see Sec   tion 4 2 5  that does not make use of non exported class  interface or  delegate types     5 VISUAL STUDIO  NET SUPPORT 38    e All other bindings are non exportable   Here is a contrived example     structure S   struct  _classtype Counter init  with  local val privateRef   ref init    in  current       privateRef  and setToCurrent  i int  amp     i      privateRef   end  val x  5  val y    I   m a string   val c   Counter 5     fun f x    x 1  fun prnl x    case x of NONE   gt       SOME s   gt  print  s     n    end    This will be exported as a  NET class S with the following Cf pseudo signature     public sealed class S    public class Counter    public Counter int init    public virtual int current     public virtual void setToCurrent ref int i       public static readonly int x   public static readonly string y   public static readonly C c   public static int f int x    public static void prin string x      A future release of SML NET will support the export of arbitrarily nested  structures  merging classes and substructures with equivalent names on exp
64. ticular applications of the proper constructor  The  derived constructors are bound in a separate structure  named after the enu   meration type  The proper constructor and its derived constant constructors  can be used in patterns as well as expressions    For example  values of the C   enumeration type     public enum MyEnum  A  B CH A     may be manipulated in SML NET as follows     type enum   MyEnum  fun fromInt i   MyEnum i  fun toInt  MyEnum i    i    fromString  B    MyEnum B  fromString  C    MyEnum C  fromString s   MyEnum  val0f  Int fromString s      fun toString MyEnum A    A     toString MyEnum B    B     toString MyEnum C    C     this case is redundant         toString  MyEnum i    Int toString i  fun fromString  A    MyEnum A  l  l  l    Whether in a pattern or expression  the constructor MyEnum  A is completely  equivalent to writing MyEnum 0 instead    Enumerations  like other primitive types  are also value types  their values  can be cast to and from System Enum  System ValueType and  System Object  and can also have methods invoked on them     4 LANGUAGE EXTENSIONS FOR  NET 28    Note that  in  NET  the constants defined for an enumeration type are not  necessarily exhaustive of the possible range of values  nor are they required to  name distinct values  This feature distinguishes  NET enumeration types from  the familiar SML pattern of defining an n valued enumeration by declaring a  datatype with n distinct  constant constructors        4 7 Storage Ty
65. tion program  run SML NET in command   line mode as shown below     C  smlnet gt bin smlnet  source demos sort Sort  SML NET 1 0  Analysing dependencies   done     Linking modules   done    Compiling whole program   done   Compilation succeeded  output in Sort exe  C  smlnet gt     This tells SML NET to compile a top level SML structure called Sort  assumed  to be found in the directory specified  demos sort  in a file called Sort sml   and to produce an executable with the name Sort exe  If this is the first time  that any SML NET program has been compiled  then you will notice that most  of the Basis library is compiled too    Alternatively  first enter the interactive compilation environment     C  smlnet gt bin smlnet  SML NET 1 0       Then type the commands that follow the   prompts below       source demos sort     export Sort     make   Analysing dependencies   done    Linking modules   done    Compiling whole program   done   Compilation succeeded  output in Sort exe      run 20   Before sorting  60 37 14 91 68 45 22 99 76 53 30 7 84 61     23  After sorting  7 14 15 22 23 30 37 38 45 46 53 60 61 68     99    quit   C Asmlnet gt     The source command tells the compiler where to look for SML source files   which by default have the extensions  sml  for structures and functors  and   sig  for signatures   The export command specifies the name of a top level  SML structure to be exported as a  NET class in the executable  Then make    2 GETTING STARTED 8    tells SML N
66. tion will be lifted in a future release     A 4 Overloading    SML NET resolves default types for overloaded constants and operators at each  val or fun binding  This is a smaller context than that used by other imple   mentations but is permitted by the Definition  2  Appendix E   The following  typechecks under SML NJ and Moscow ML but not under SML NET because  x is assumed to have the default type int at the binding of sqr     B THE STANDARD ML BASIS LIBRARY 43    fun g  x y     let   fun sqr x   X x  in   sqr  x 2 0    y  end    For maximum compatibility with other implementations a future version of  SML NET will use the largest context permitted     B The Standard ML Basis Library    A large part of the Standard ML Basis Library is implemented  Online docu   mentation for the basis library may be found at http    www standardml  org   Basis index html    Table 2 lists the structures that exist with omissions and discrepancies de   tailed  to appear      C Support for ML Lex  ML Yacc and SML NJ  Libraries    Many people have asked about using SML NET with some of the extra tools  and libraries which come with SML NJ  This is usually not hard  but does  involve a certain amount of work writing  smlnet scripts to define entity map   pings  To avoid everybody having to do this independently  we have included  SML NETified versions of some of the most popular    The distribution comes with SML NET versions of the parser generator tools  ML Lex and ML Yacc  The support libra
67. to top level function bindings in  SML     e Where there is no obvious equivalent  extend the SML language  For ex   ample  new  NET classes can be defined within SML using a new classtype  construct     The sections which follow describe the extensions in detail  Each section  is accompanied by small example programs illustrating a single feature  These  live in directories displayed on the right of the section heading        4 1 Namespaces  classes and nesting samples structures             If one ignores the class hierarchy and instance fields and methods  i e  a non   object oriented fragment of  NET   then  NET classes can be seen  and are  used  as a minimal module system  providing a way of packaging together static  fields  methods  and nested classes that are logically related  Namespaces in   NET provide a further level of structuring  grouping together many classes  into a single group  We model both using the SML module system    Top level namespaces  e g  System  are reflected in SML NET as top level  structures  with nested namespaces  e g  System Drawing  reflected as sub   structures  e g  structure Drawing inside structure System     Classes are reflected in SML NET as three separate bindings     e as type identifiers  see Section 4 2 2      e as values of function type used to construct instances of the class  see  Section 4 3 1   and    e as structures containing value bindings that reflect static fields and meth   ods  see Sections 4 4 1 and 4 4 2  and sub
68. w to inspect their values at runtime  these methods cannot be  called from SML NET source code     Building in a Debug configuration is equivalent to setting the debug flag of  the command line SML NET compiler    WARNING  Debug configurations inhibit many SML NET optimisations and  produce considerably worse compiled code than Release configurations   NOTE  Your debug experience is affected by the IL assembler used by your  installation of SML NET  see Section 3 17 for more details      5 5 Customizing the Package Installer    The package installer may fail because it cannot locate a tool it requires  so we  have included its SML NET source code  Should you need to fix the installer   the code resides in vs install sml and vs RegTools sml  with build script  vs install smlnet  After editing the installer  you can rebuild it as follows     cd vs    bin smlnet  install smlnet    Note the installer   s executable is placed in the root directory of the distrib   ution  not in vs   The installer must reside in this directory to work correctly     A LANGUAGE RESTRICTIONS 42    as it uses its own location to infer the location of the compiler binaries     A Language restrictions    A l Overflow    The Standard ML Basis library requires certain arithmetic operations to raise  an Overflow exception when the result is not representable  e g  Int    Int      A correct implementation in CLR of these Basis operations would have a perfor   mance unacceptable in most applications  so it wa
    
Download Pdf Manuals
 
 
    
Related Search
    
Related Contents
  VPCF1 Series Hard Disk Drive Replacement Instructions  file - Open Research Online  SETUP GUIDE  Economic and Social Council Distr.: General  Manuel d`utilisation Avertisseur radar    User Manual    Copyright © All rights reserved. 
   Failed to retrieve file