関数とモジュール

関数の定義、呼び出し、モジュール分割を学びます。


関数の定義

基本構文

filename.ngs
fn add(a: i32, b: i32) i32 {
    a + b
}

戻り値なし

filename.ngs
fn greet(name: str) void {
    io.println("Hello, " + name + "!")
}

引数なし

filename.ngs
fn get_version() str {
    "1.0.0"
}

関数の呼び出し

filename.ngs
val result = add(10, 20)  // 30
greet("Alice")            // Hello, Alice!
val ver = get_version()   // "1.0.0"

関数式 (Fn)

関数は変数に代入できます:

filename.ngs
val double = fn(x: i32) i32 {
    x * 2
}

val result = double(5)  // 10

高階関数

関数を引数に取る関数:

filename.ngs
fn apply(f: fn(i32) i32, x: i32) i32 {
    f(x)
}

val result = apply(double, 5)  // 10

モジュール

import

filename.ngs
// 標準ライブラリ
import "std:io"
import "std:math"

// ローカルファイル
import "utils.ngs"
import "utils/string.ngs"

モジュールの利用

filename.ngs
import "std:io"
import "std:math"

fn main() void {
    io.println("Hello!")
    
    val pi = math.PI
    val sqrt2 = math.sqrt(2.0)
    
    io.println(pi)
    io.println(sqrt2)
}

エクスポート

utils.ngs
// utils.ngs
export fn add(a: i32, b: i32) i32 {
    a + b
}

export fn multiply(a: i32, b: i32) i32 {
    a * b
}
main.ngs
// main.ngs
import "utils"

fn main() void {
    val sum = utils.add(10, 20)
    val product = utils.multiply(10, 20)
    
    io.println(sum)
    io.println(product)
}

ドキュメントコメント

filename.ngs
@doc {
    doc = "2つの整数を加算します"
    param_a = "最初の整数"
    param_b = "2番目の整数"
    return = "加算結果"
    example = """
    val result = add(10, 20)
    // result = 30
    """
}
fn add(a: i32, b: i32) i32 {
    a + b
}

メソッド(関数の呼び出し方)

メソッド構文

filename.ngs
import "std:io"

val s = "Hello, World!"

// 通常の呼び出し
val len1 = str.len(s)

// メソッド構文
val len2 = s.len()
// len1 == len2

チェーン呼び出し

filename.ngs
val result = "hello".to_upper().len()
// "hello" → "HELLO" → 5

再帰関数

filename.ngs
fn factorial(n: i32) i32 {
    if n <= 1 {
        1
    } else {
        n * factorial(n - 1)
    }
}

val result = factorial(5)  // 120

クロージャ

filename.ngs
fn make_adder(x: i32) fn(i32) i32 {
    fn(y: i32) i32 {
        x + y
    }
}

val add5 = make_adder(5)
val result = add5(10)  // 15