標準入力に渡された項を解釈し、型検査して実行します。 単純なラムダ計算にはラムダ抽象と関数適用ぐらいしかありませんが、それだとサンプルが書きにくいので自然数とBoolとif式を実装しています。
stack run < samples/sample1.txt
この言語に存在する型は以下の3つのみです。
Int -- 整数
Bool -- Boolean
T1 -> T2 -- T1からT2への関数
自然数リテラルとBoolリテラルがあります。
0
100
true
false
ラムダ式は以下のような構文です。 引数は必ず一つで、型を必ず明記しなければいけません。
-- identity function
lambda x:Int . x
引数を複数個取るような関数が欲しいときはラムダをネストさせてください。
lambda f:Int -> Int .
lambda n:Int .
f n
項を並べれば関数適用になります。関数適用は左結合です。
(lambda x:Int . x) 100
以下のように if ... then ... else ... という構文です。
if true then 10 else 20
| シンボル | 意味 | 型 | 結合 |
|---|---|---|---|
+ |
足し算 | Int -> Int -> Int |
左 |
- |
引き算 | Int -> Int -> Int |
左 |
* |
掛け算 | Int -> Int -> Int |
左 |
/ |
割り算(小数点以下切り捨て) | Int -> Int -> Int |
左 |
&& |
論理積 | Bool -> Bool -> Bool |
左 |
| ` | ` | 論理和 | |
== |
等しい | ∀a. a -> a -> Bool |
無 |
-- による行コメントと {- ... -} という範囲コメントが使えます。