Language "OCaml Light"

#11 Module implementations

Syntax
  UI : unit-implementation
  ::= (semicolon-pair* module-items semicolon-pair*)?
  
  MIS : module-items 
  ::= definition
    | expr
    | module-items semicolon-pair* module-item

  MI : module-item
  ::= definition
    | semicolon-pair expr

  D : definition
  ::= let-definition
	| type-definition
	| exception-definition
Lexis
  SCP : semicolon-pair ::= ';;'

Semantics
  interpret[[ UI:unit-implementation ]] : =>environments
Rule
  interpret[[  ]] = map( )
Rule
  interpret[[ SCP1* MIS SCP2* ]] = 
    handle-thrown(
	  scope(
	    ocaml-light-core-library,
	  	accumulate(define-or-evaluate-items[[ MIS ]])),
      sequential(
        print ("Uncaught exception: ", ocaml-light-to-string given, "\n"),
        map()))

Semantics
  define-or-evaluate-items[[ _:module-items ]] : (=>envs)+
Rule
  define-or-evaluate-items[[ LD ]] =
    ocaml-light-define-and-display define-values[[ LD ]]
Rule
  define-or-evaluate-items[[ TDS ]] = define-types[[ TDS ]]
Rule
  define-or-evaluate-items[[ ED ]] = define-exception[[ ED ]]
Rule
  define-or-evaluate-items[[ E ]] =
    ocaml-light-evaluate-and-display evaluate[[ E ]]
Rule
  define-or-evaluate-items[[ MIS SCP* D ]] =
    ( define-or-evaluate-items[[ MIS ]], define-or-evaluate-items[[ D ]] )
Rule
  define-or-evaluate-items[[ MIS SCP* SCP E ]] =
    ( define-or-evaluate-items[[ MIS ]], define-or-evaluate-items[[ E ]] )