Let Forms

Syntax

x[let_pri] := "let" spattern "=" x[let_pri] "in" x[let_pri]
x[let_pri] := "let" spattern "=" x[let_pri] "in" x[let_pri]
x[let_pri] := "let" "fun" sdeclname fun_return_type "=" smatching+ "in" x[let_pri]
x[let_pri] := "let" pattern_match
x[let_pri] := pattern_match

//$ Named temporary value.
x[sas_expr_pri] := x[sas_expr_pri] "as" sname


//$ Named variable.
x[sas_expr_pri] := x[sas_expr_pri] "as" "var" sname

Description

A let form allows an expression to be factored:

let p = expr1 in expr2

for example:

let x2 = x * x in
let y2 = y * y in
  sqrt (x2 + y2)

Another let form defines a local function:

let fun sq(x:int) = x * x in
  sqrt (sq x + sq y)

The as expressions allow a val or var to be defined inside an expression. The definition is lifted out of the expression and replaced by the named variable. This program:

var y = (1 as x) + 10;
var z = y + 100;
println$ x + y + z;

is equivalent to:

var x = 1;
var y = x + 10;
var z = y + 100;

println$ x + y + z;