Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

関数

WapLでは1.2で述べたように基本的にmain関数がエントリーポイントになります。しかし、main以外の関数をエントリーポイントのようにすることも可能です。

fn start(){
    println("Hello, Start!");
}
start();

これは内部的には一番最後のstart()の呼び出しが_TOPLEVEL_という見えない関数に入れられて、_TOPLEVEL_が最初に呼ばれて関数の外に書いてある処理を順に行うのでstart関数が呼ばれています。

WapLでは関数は必ず関数の呼び出しより上で関数の定義がされている必要があります。

fn main():i32{
    another();
    return 0s;
}
fn another():void{
    println("Hello, from another function!");
}
Function another not found

のようにエラーがでます。これを正しく動くようにするためには以下のような順で書く必要があります。

fn another():void{
    println("Hello, from another function!");
}
fn main():i32{
    another();
    return 0s;
}

または宣言だけを先に置くことでも解決できます:

declare another():void;
fn main():i32{
    another();
    return 0s;
}
fn another():void{
    println("Hello, from another function!");
}

このように関数の定義はfn、宣言はdeclareで行います。

関数の引数

引数は関数のシグネチャの一部になる特別な変数のことで、宣言時には実引数は作らなくてよく、()の中に型のみを,区切りで列挙し、関数の宣言のときは型と変数名を書きます。

declare another_function(i64,i64);
fn main():i32{
    another_function(5,3)
    return 0s;
}
fn another_function(i64 x,i64 y){
    println(format("%d,%d",x,y));
}

戻り値のある関数

引数を書いた括弧の後ろに戻り値がある場合は:で区切ってその後に戻り値の型を書きます。またreturnで戻り値を返します。:

fn five():i64{
    return 5;
}
fn main():i32{
    println(format("five() return %d",five()));
    return 0s;
}

ここではfive関数の戻り値の型はi64return5を返しています。declareで宣言をするときも同様です。

declare five():i64;
fn main():i32{
    println(format("five() return %d",five()));
    return 0s;
}
fn five():i64{
    return 5;
}