式は計算すると値になるものです。

関数適用式

式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 文字列連結
print 値の表示
println 値を表示して改行
tostring 値の文字列化
error 実行時エラーを発生させる
ref リファレンスセルを作る
deref リファレンスセルの値を取り出す
assign リファレンスセルへの代入
loadnull null値を生成する
intequal 強制的に整数として値の等しさを調べる