let sqrtSum = (int x, int y) -> int { let x2 = x * x; let y2 = y * y; return x2+y2; } let pi = 3.14159; let _2p = (intToFLo 2) *. pi; let c = if (2 == 2) then 2 else 3; let aStr = "hello"; let rec fac = (int n)-> int { if n == 0 then 1 else (fac (n - 1));}; type student = Student {int id, string name}; let alice = Student {id=20, name="Alice"}; alice.name = "Siobhan"; let customAnd = (@ 'a has age) ('a x, 'a y) => {'a > 'b}; type list 'a = (Cons 'a (List 'a)) | Nil; import("alifbata.clo"); # 匯入檔案 alifbata # t of import :== string -> Option string string Error("string") | Ok("import aaa") # 型別構造子統一大寫,型別小寫 # PROG ::= (STMT | COMMENT | STMT_COMMENT)* COMMENT ::= # COMMENT_INNER # COMMENT_INNER ::= [^#]+ STMT ::= (TYPE_DEF | VAR_DEF | SET | EXPR ) ";" TYPE_DEF ::= type ID "=" UNION | type ID TYPE_VARS+ "=" UNIOM TYPE_VARS = ' ID UNION ::= (REC "|" UNION) | REC REC ::= ID ( TYPES ) TYPES ::= TYPE+ TYPE ::= ID EXPR ::= if SUB_EXPR then IF_BRANCH else IF_BRANCH | SUB_EXPR IF_BRANCH ::= EXPR | { BLOCK } SUB_EXPR ::= COMPAREE| COMPAREE (LE|GE|LT|GT|EQ|NE) EXPR COMPAREE ::= FAC| (FAC(ADD | SUB) FAC) FAC ::= APPLY | (APPLIER (MUL | DIV) APPLY) APPLY ::= "(" ID APPLYEE* ")" | APPLYEE APPLYEE ::= REF | CONST | EXPR | FUNC * CONST ::= INT | STR | FLO | BOOL BOOL ::= "true" | "false" FUNC ::= FUNC_OPTION? ( ARGS? ) -> TYPE {BLOCK} BLOCK ::= PROG (return ID |noReturn) ; ARGS ::= TYPE (TYPE_VARS | ID) | TYPE (TYPE_VARS | TYPE_VARS) , ARGS REF ::= VAR "." ID | VAR VAR ::= ID VAR_DEF ::= "let" VAR "=" EXPR SET ::= VAR "=" EXPR FUNC_OPTION ::= ( @ TYPE_HAS (, TYPE_HAS)* ) TYPE_HAS ::= TYPE_VAR "has" ID