- baud rate: 115200
- no parity
- 1 stop bit
- $LITERAL := $DECIMAL | $BOOL
- $DECIMAL
- decimal number
- examples: 0, 100, 224, -130, 4457
- $BOOL := true | false
- $ID
- a string whose first character is not captal (not 'A' to 'Z')
- excludes "true" and "false"
- $TID
- a string whose first character is captal ('A' to 'Z')
- $PRIM := Int | Bool | $PRIM_LIST | $PRIM_TUPLE
- $PRIM_LIST := '( $PRIM )
- $PRIM_TUPLE := [ $PRIM+ ]
- $TYPE := Int | Bool | $TYPE_LIST | $TYPE_TUPLE | $TYPE_FUN | $TYPE_DATA
- $TYPE_LIST := '( $TYPE )
- $TYPE_TUPLE := [ $TYPE+ ]
- $TYPE_DATA := $TID | ( $TID $PRIM* )
- $TYPE_FUN := ( $EFFECT ( -> $TYPES $TYPE ) )
- $EFFECT := Pure | IO
- $TYPES := $TYPE | ( $TYPE* )
examples:
'(Int)
[Int Bool]
(Pure (-> (Int INT) Bool))
'('(Int Bool))
[Int Int '([Int Bool])]
- $DATA := ( data $DATA_NAME $MEMBER* )
- $DATA_NAME := $TID | ( $TID $ID* )
- $MEMBER := $TID | ( $TID $PRIM* )
examples:
(data Dim2
(X Int)
(Y Int))
(data (Maybe t)
(Just t)
Nothing)
- $DEFUN := ( $HEAD_DEFUN $ID ( $ID* ) $TYPE_FUN $EXPR )
- $HEAD_DEFUN := export | defun
- $EXPR := $LITERAL | $ID | $LET | $IF | $MATCH | $LIST | $TUPLE | $APPLY
- $LET := ( let ( $DEFVAR+ ) $EXPR )
- $DEFVAR := ( $LETPAT $EXPR )
- $LETPAT := $ID | [ $LETPAT ]
- $IF := ( if $EXPR $EXPR $EXPR )
- $LIST := '( $EXPR* )
- $TUPLE := [ $EXPR+ ]
- $MATCH := ( match $EXPR $MBODY+ )
- $MBODY := ( $PATTERN $EXPR )
- $PATTERN := _ | $LITERAL | $ID | [ $PATTERN+ ] | ( $TID $PATTERN+ )
- cons: (-> (T '(T) '(T))
- car: (-> '(T) (Maybe T))
- cdr: (-> '(T) (Maybe '(T)))
- nth: (-> (Int [T]) (Maybe T))
- nth: (-> (Int '(T)) (Maybe T))