関数

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

results matching ""

    No results matching ""