Todo アプリケーション

NagiScript で Todo アプリケーションを開発するチュートリアルです。

現行仕様(v0.2.0)

この例は現行仕様の構文(print / println、string 型、-> と明示 return、while、裸の列挙バリアントの match)で書かれており、文法としては現行コンパイラー v0.2.0 で動作する形です。import / std:args / std:fs は使えないため、ここではメモリ上だけの簡易ロジックとして構成しています。


概要

このチュートリアルでは、NagiScript で簡単な Todo アプリケーションを作成します。


実装(単一ファイル)

main.ngs
struct Todo {
    id: i32
    title: string
    completed: bool
}

struct TodoList {
    items: [Todo; 100]
    count: i32
}

fn new_list() -> TodoList {
    return TodoList {
        items: [Todo { id: 0, title: "", completed: false }; 100],
        count: 0
    }
}

fn add_todo(list: &TodoList, title: string) {
    if list.count < 100 {
        list.items[list.count] = Todo { id: list.count + 1, title: title, completed: false }
        list.count = list.count + 1
    }
}

fn list_todos(list: &TodoList) {
    var i = 0
    while i < list.count {
        val t = list.items[i]
        var line = ""
        if t.completed {
            line = "[x] "
        } else {
            line = "[ ] "
        }
        println(line)
        println(t.title)
        i = i + 1
    }
}
ロードマップ

上記の可変参照 &TodoList による書き換えは、現行では参照の変更が不安定な場合があります。より確実なのは値渡しで構造体を返す「純関数」スタイルです(下記の main 例はその方針)。

main.ngs — メインプログラム

main.ngs
struct Todo {
    id: i32
    title: string
    completed: bool
}

fn main() {
    // 値渡し・純関数スタイル(現行で確実な方法)
    val t1 = Todo { id: 1, title: "Buy groceries", completed: false }
    val t2 = Todo { id: 2, title: "Write docs", completed: true }

    println(t1.title)
    println(t2.title)

    var found = false
    if t1.id == 2 {
        found = true
    } else {
        found = false
    }
    println(found)
}
ロードマップ

コマンドライン引数(--command 等)の取得、ファイル保存(std:fs)、動的な List は現行では未実装です。完全な対話型 Todo ツールは将来仕様となります。


実行例

bash
# ビルドと実行
nagiscript build main.ngs -o todo
./todo

# 出力例
Buy groceries
Write docs
false

学べること

  1. 構造体: 複数のフィールドをまとめて表現
  2. 固定長配列: [Todo; N] によるデータの保持
  3. 制御構文: if / while の使用
  4. 明示 return: -> 型注釈と return