式
式は計算すると値になるものです。
関数適用式
式1 式2
式2の計算結果を式1に適用します。
do式
基本形
do 式1; 式2; ...; 式n; in 式
do式は式1から式nまでの式をを評価してそれぞれの結果を捨てて、
式の評価結果を返します。
それぞれの式は()型である必要があります。
式nの後ろのセミコロンは省略できます。
特殊形式
do 式1; 式2; ...; 式n; end
上の式は以下の式と等価です。
do 式1; 式2; ...; 式n; in ()
let式
基本形
let パターン = 式1 in 式2
let式は式1を評価してパターンにマッチさせ式2を評価しその結果を返します。
特殊形式
let パターン パターン1 パターン2 ... = 式1 in 式2;
上の式は以下の式と等価です。
let パターン = \パターン1 パターン2 ... -> 式1 in 式2;
fun式
fun 関数名1 パターン11 パターン12 ... = 式1
and 関数名2 パターン21 パターン22 ... = 式2
...
and 関数名n パターンn1 パターンn2 ... = 式n
in 式
fun式は相互再帰関数を定義して式を評価します。
=の後ろの式がブロック式の場合は、
パターンの列を省略できます。
if式
if 式1 -> 式2 else 式3
if式は式1が true であれば式2を評価した結果を返し、 式1が false であれば式3を評価した結果を返します。
pat式
pat パターン ? ガード = 式1 -> 式2 else 式3
pat文は式1を評価しパターンとマッチさせ、ガードを満たした場合は式2を評価した結果を返し、 パターンマッチに失敗するかガードを満たさなかった場合は式3を評価します。 ? ガード の部分は省略可能です。
ブロック式
{ ブロック構成子1; ブロック構成子2; ... ブロック構成子n; }
ブロック式は{と}で囲まれたブロック構成子の列です。
最後のブロック構成子nの後ろのセミコロンは省略できます。
ブロック構成子には、パターンマッチ式の
パターン ? ガード -> 式
もしくは、以下のいずれかの形式がきます。
do 式
let パターン = 式
let パターン パターン1 パターン2 ... = 式
fun 関数名1 パターン11 パターン12 ... = 式1
and 関数名2 パターン21 パターン22 ... = 式2
...
and 関数名n パターンn1 パターンn2 ... = 式n
ブロック式は引数を受け取って、中に含まれるパターンマッチ式を 上から順番に試していきます。 その際、途中にdo式があったらそのdo式の式を評価して、 let式やfun式があったら、新しい変数や関数が定義されます。
for式
for式はリストの各値に対して新しい値を生成して、 その値を含む新しいリストを生成する構文です。
for 列挙子1; 列挙子2; ...; 列挙子n; in 式
という構文をしており、列挙子には、
パターン <- 式
もしくは
if 式;
を指定します。
パターン <- 式はリストになる式の各要素をパターンに束縛します。
if式はリストの要素になれる値の条件を指定します。
型強制式
(式 : 型)
で式が指定した型を持つことを強制します。
コンス式
式1 :: 式2
評価するとリストになる式2の先頭に式1の評価結果を連結します。
論理積
式1 && 式2
式1と式2が両方ともtrueであればtrueを返します。 式1がfalseの場合、式2は評価されません。
論理和
式1 || 式2
式1と式2のいずれかがtrueであればtrueを返します。 式1がtrueの場合、式2は評価されません。
中値演算子式
式1 中値演算子 式2
演算子にはそれぞれ対応する名前がついており、 中値演算子の場合は、
演算子名 式1 式2
という式に展開されます。
中値演算子と演算子名の対応は以下の通りです。
| 演算子 | 演算子名 |
|---|---|
| (**) | __operator_astast |
| (<<) | __operator_ltlt |
| (>>) | __operator_gtgt |
| (..) | __operator_dotdot |
| (*) | __operator_ast |
| (/) | __operator_sls |
| (%) | __operator_per |
| (/.) | __operator_slsdot |
| (*.) | __operator_astdot |
| (+) | __operator_pls |
| (-) | __operator_mns |
| (+.) | __operator_plsdot |
| (-.) | __operator_mnsdot |
| (++) | __operator_plspls |
| (^) | __operator_hat |
| (<) | __operator_lt |
| (>) | __operator_gt |
| (<=) | __operator_le |
| (>=) | __operator_ge |
| (==) | __operator_eqeq |
| (<>) | __operator_ltgt |
| (:=) | __operator_coleq |
| (<|) | __operator_ltbar |
| (|>) | __operator_bargt |
| ($) | __operator_doll |
| (>>=) | __operator_gtgteq |
| (=<<) | __operator_eqltlt |
| (=<) | __operator_eqlt |
| (<*>) | __operator_ltastgt |
| (<*) | __operator_ltast |
| (*>) | __operator_astgt |
| (<+>) | __operator_ltplsgt |
| (<+) | __operator_ltpls |
| (+>) | __operator_plsgt |
| (<->) | __operator_ltmnsgt |
| (<|>) | __operator_ltbargt |
| (<$>) | __operator_ltdollgt |
| (<**>) | __operator_ltastastgt |
| (<**) | __operator_ltastast |
| (**>) | __operator_astastgt |
| (!!) | __operator_bangbang |
| (??) | __operator_queque |
| (***) | __operator_astastast |
| (&&&) | __operator_ampampamp |
| (+++) | __operator_plsplspls |
| (|||) | __operator_barbarbar |
| (--) | __operator_mnsmns |
| (---) | __operator_mnsmnsmns |
対応する名前の変数に値を束縛することで、 演算子の意味を定義できます。 いくつかの演算子は標準ライブラリで意味があらかじめ 決められています。
前置演算子式
前置演算子 式
演算子にはそれぞれ対応する名前がついており、 前置演算子の場合は、
演算子名 式
という式に展開されます。
前置演算子と演算子名の対応は以下の通りです。
| 演算子 | 演算子名 |
|---|---|
| (~-) | __operator_neg |
| (~-.) | __operator_negdot |
| (!) | __operator_bang |
対応する名前の変数に値を束縛することで、 演算子の意味を定義できます。 いくつかの演算子は標準ライブラリで意味があらかじめ 決められています。
演算子の関数化
(演算子)
と書くと、対応する演算子を関数として扱うことができます。
以下の3つは演算子ではありませんが、括弧で囲むことで関数にできます。
(&&)
(||)
(::)
関数の中置
式1 `関数名` 式2
という式は、以下の式に展開されます。
関数名 式1 式2
演算子優先順位
演算子の結合と優先順位は以下のようになっています。 表の下から上に向かって優先度が高くなっています。
| 結合 | 演算子 |
|---|---|
| 右 | (~-), (~-.), (!) |
| 左 | メソッド呼び出し |
| 左 | 関数適用 |
| 右 | (**), (<<), (>>), (..) |
| 左 | (*), (/), (%), (*.), (/.) |
| 左 | (+), (-), (+.), (-.) |
| 右 | (++), (^), (::) |
| 左 | (<), (>), (<=), (>=), (==), (<>) |
| 右 | (&&) |
| 右 | (||) |
| 左 | `関数名` |
| 左 | (:=), (<|), (|>), ($), (>>=), (=<<), (=<), (<*>), (<*), (*>), (<+>), (<+), (+>), (<->), (<|>), (<$>), (<**>), (<**), (**>), (!!), (??), (***), (&&&),(+++), (|||), (--), (---) |
| 右 | (< |
プリミティブ関数呼び出し
__prim "プリミティブ名" (式1, 式2, ...)
言語にあらかじめ備わっているプリミティブ関数を呼び出します。
プリミティブ関数には以下のものがあります。
| プリミティブ関数名 | 機能 |
|---|---|
| add | 整数加算 |
| sub | 整数減算 |
| mul | 整数乗算 |
| div | 整数除算 |
| mod | 整数剰余 |
| band | ビットごとのAND |
| bor | ビットごとのOR |
| bxor | ビットごとのXOR |
| bshr | 算術右シフト |
| bshrun | 論理右シフト |
| bshl | 左シフト |
| bnot | ビットの反転 |
| fadd | 浮動小数点数加算 |
| fsub | 浮動小数点数減算 |
| fmul | 浮動小数点数乗算 |
| fdiv | 浮動小数点数除算 |
| eq | 比較(等しい) |
| ne | 比較(等しくない) |
| lt | 比較(より小さい) |
| gt | 比較(より大きい) |
| le | 比較(以下) |
| ge | 比較(以上) |
| concat | 文字列連結 |
| 値の表示 | |
| println | 値を表示して改行 |
| tostring | 値の文字列化 |
| error | 実行時エラーを発生させる |
| ref | リファレンスセルを作る |
| deref | リファレンスセルの値を取り出す |
| assign | リファレンスセルへの代入 |
| loadnull | null値を生成する |
| intequal | 強制的に整数として値の等しさを調べる |