式
式は計算すると値になるものです。
関数適用式
式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 | 強制的に整数として値の等しさを調べる |