1 let sqrtSum = (int x, int y) -> int {
8 let _2p = (intToFLo 2) *. pi;
10 let c = if (2 == 2) then 2 else 3;
14 let rec fac = (int n)-> int {
15 if n == 0 then 1 else (fac (n - 1));};
18 type student = Student {int id, string name};
20 let alice = Student {id=20, name="Alice"};
22 alice.name = "Siobhan";
24 let customAnd = (@ 'a has age) ('a x, 'a y) => {'a > 'b};
26 type list 'a = (Cons 'a (List 'a)) | Nil;
28 import("alifbata.clo"); # 匯入檔案 alifbata #
30 t of import :== string -> Option string string
31 Error("string") | Ok("import aaa")
36 PROG ::= (STMT | COMMENT | STMT_COMMENT)*
37 COMMENT ::= # COMMENT_INNER #
38 COMMENT_INNER ::= [^#]+
39 STMT ::= (TYPE_DEF | VAR_DEF | SET | EXPR ) ";"
40 TYPE_DEF ::= type ID "=" UNION
41 | type ID TYPE_VARS+ "=" UNIOM
43 UNION ::= (REC "|" UNION) | REC
48 EXPR ::= if SUB_EXPR then IF_BRANCH else IF_BRANCH | SUB_EXPR
49 IF_BRANCH ::= EXPR | { BLOCK }
50 SUB_EXPR ::= COMPAREE| COMPAREE (LE|GE|LT|GT|EQ|NE) EXPR
51 COMPAREE ::= FAC| (FAC(ADD | SUB) FAC)
52 FAC ::= APPLY | (APPLIER (MUL | DIV) APPLY)
53 APPLY ::= "(" ID APPLYEE* ")" | APPLYEE
54 APPLYEE ::= REF | CONST | EXPR | FUNC
55 * CONST ::= INT | STR | FLO | BOOL
56 BOOL ::= "true" | "false"
57 FUNC ::= FUNC_OPTION? ( ARGS? ) -> TYPE {BLOCK}
58 BLOCK ::= PROG (return ID |noReturn) ;
60 REF ::= VAR "." ID | VAR
62 VAR_DEF ::= "let" VAR "=" EXPR
64 FUNC_OPTION ::= ( @ TYPE_HAS (, TYPE_HAS)* )
65 TYPE_HAS ::= TYPE_VAR "has" ID