Language "OCaml Light"

#6 Patterns

Syntax
  P : pattern 
  ::= value-name 
	|  '_'
	| constant
	| pattern 'as' value-name
	| '(' pattern ')'
	| '(' pattern ':' typexpr ')'
	| pattern '|' pattern
	| constr pattern
	| pattern comma-pattern+
	| '{' field '=' pattern semic-field-pattern* ';'? '}'
	| '[' pattern semic-pattern* ';'? ']'
	| pattern '::' pattern

  CP : comma-pattern ::= ',' pattern
  
  SP : semic-pattern ::= ';' pattern
  
  SFP : semic-field-pattern ::= ';' field '=' pattern

Rule
  [[ '(' P ')' ]] : pattern = [[ P ]]
Rule
  [[ '(' P ':' T ')' ]] : pattern = [[ P ]]
Rule
  [[ '{' F '=' P SFP* ';' '}' ]] : pattern = [[ '{' F '=' P SFP* '}' ]]
Rule
  [[ '[' P SP* ';' ']' ]] : pattern = [[ '[' P SP* ']' ]]

## Pattern evaluation

Semantics
  evaluate-pattern[[ _:pattern ]] : =>patterns
Rule
  evaluate-pattern[[ VN ]] = pattern-bind(value-name[[ VN ]]) 
Rule
  evaluate-pattern[[ '_' ]] = pattern-any
Rule
  evaluate-pattern[[ CNST ]] = value[[ CNST ]]
Rule
  evaluate-pattern[[ P 'as' VN ]] = 
    pattern-unite(evaluate-pattern[[ P ]], pattern-bind(value-name[[ VN ]]))
Rule
  evaluate-pattern[[ P1 '|' P2 ]] =
    pattern-else(evaluate-pattern[[ P1 ]], evaluate-pattern[[ P2 ]])
Rule
  evaluate-pattern[[ CSTR P ]] =
    variant(constr-name[[ CSTR ]], evaluate-pattern[[ P ]])
Rule
  evaluate-pattern[[ P1 ',' P2 CP* ]] =
    tuple( evaluate-comma-pattern-sequence[[ P1 ',' P2 CP* ]] )
Rule
  evaluate-pattern[[ '{' F '=' P SFP* '}' ]] =
    pattern closure(match-loosely(
      given,
	  record(map-unite(evaluate-field-pattern-sequence[[ F '=' P SFP* ]]))))
Rule
  evaluate-pattern[[ '[' P SP* ']' ]] =
    [ evaluate-semic-pattern-sequence[[ P SP* ]] ]
Rule
  evaluate-pattern[[ P1 '::' P2 ]] =
    pattern closure(
      if-true-else(is-equal(given,[]),
        fail,
        collateral(
          match(head(given), evaluate-pattern[[ P1 ]]),
          match(tail(given), evaluate-pattern[[ P2 ]]))))

## Pattern sequence evaluation

Semantics
  evaluate-comma-pattern-sequence[[ _:(pattern comma-pattern*) ]] : 
                                                   (=>patterns)+
Rule
  evaluate-comma-pattern-sequence[[ P1 ',' P2 CP* ]] =
    evaluate-pattern[[ P1 ]], evaluate-comma-pattern-sequence[[ P2 CP* ]]
Rule
  evaluate-comma-pattern-sequence[[ P ]] = evaluate-pattern[[ P ]]
 

Semantics
  evaluate-semic-pattern-sequence[[ _:(pattern semic-pattern*) ]] :
                                                    (=>patterns)+
Rule
  evaluate-semic-pattern-sequence[[ P1 ';' P2 SP* ]] =
    evaluate-pattern[[ P1 ]], evaluate-semic-pattern-sequence[[ P2 SP* ]]
Rule
  evaluate-semic-pattern-sequence[[ P ]] = evaluate-pattern[[ P ]]
    
Semantics
  evaluate-field-pattern-sequence[[ _:(field '=' pattern semic-field-pattern*) ]] : 
                                          =>(maps(ids,patterns))+
Rule
  evaluate-field-pattern-sequence[[ F1 '=' P1 ';' F2 '=' P2 SFP* ]] =
    ( { field-name[[ F1 ]] |-> evaluate-pattern[[ P1 ]] },
      evaluate-field-pattern-sequence[[ F2 '=' P2 SFP* ]] )
Rule
  evaluate-field-pattern-sequence[[ F '=' P ]] =
    { field-name[[ F ]] |-> evaluate-pattern[[ P ]] }