関数
MCScriptの関数は、通常のオブジェクトと同様に扱えます。変数に代入することはもちろん、関数に関数を渡す高階関数なども簡単に実現できます。
関数リテラル
関数リテラルを使用し、匿名の関数を作成できます。MCScriptの関数は、型を指定する必要が無く、return文も必須ではありません。 MCScriptの関数は最後に評価した文の結果を返します。
fun(x) {
Println(x)
}
引数
MCScriptは関数のオーバーロードをサポートしていません。その代わりに、デフォルト引数が利用できます。
f = fun(x, y: 3) {
x + y
}
f(1) # 4
f(1, 2) # 3
ラムダ式
関数オブジェクトをJavaと同じラムダ式で記述できます。
() -> Println("test")
(x, y: 3) -> {
x + y
}
関数宣言
匿名の関数を変数に代入せずとも、名前付き関数を明示的に宣言することもできます。
fun f(x, y) {
x + y
}
f(1, 2)
関数宣言では、定数に関数オブジェクトを代入しています。
const f = fun(x, y) {
x + y
}
そのため、関数名の付いた変数に代入することはできません。
fun f(x, y) {
x + y
}
f = 1 # error
また、トップレベルでの関数宣言はほかの文より先に評価されます。
f(1) # error
f = fun(x) {
Println(x)
}
f(x) # pass
fun f(x) {
Println(x)
}
型ヒント
関数リテラルや、関数宣言時に戻り値の型を指定することができます。これは、実際の動作には影響を及ぼしませんが、mcsコマンドで補完を利用できるようになります。
fun f(x): String {
x.toString()
}
公開関数
スクリプトファイルに記述する場合、通常の関数では外部から呼び出すことができません。MCScriptでは、関数名の最初の文字を大文字にすることにより、外部から呼び出せるようになります。
public.mcs
fun Public(x) {
Println(x)
}
main.mcs
Public("Hi")
公開関数は、外部と独立した環境で実行されます。そのため、上位レベルの変数や、関数を呼び出すことができません。
x = 1
fun f(s) {
Println(s)
}
fun Public() {
a = x # error
f(a) # error
}
Public()
関数呼び出し
add関数を宣言しておきます。
fun add(x, y: 1) {
x + y
}
通常の関数呼び出しの場合、以下のように記述します。
add(2, 3) # 5
デフォルト引数があるため、引数が一つでも呼び出せます。
add(2) # 3
また、関数呼び出しの際、引数を名前で指定できます。
fun sum(a, b:1, c:2) {
a + b + c
}
sum(1) # 4
sum(1, 2) # 5
sum(1, c: 3) # 5
sum(c: 3, b: 2, 0) # 5