Sugu Language

Sugu 言語 バックログ

各 Phase のレビューで発見された課題をまとめたもの。 Phase 実装計画(implementation.md)に移動した項目は削除する。


Phase 2 未実装タスク(低優先度)

Step 4: REPL 機能強化

詳細は後述の「REPL パッケージ」セクションを参照

Step 5: コード品質向上

詳細は後述の各パッケージセクションを参照


Phase 3 レビュー課題

エラーハンドリング関連(PR #17)


Phase 2 レビュー課題

配列関連(PR #12)

マップ関連(PR #13)

組み込み関数関連(PR #14)

位置情報関連(PR #15)


位置情報関連(横断的課題)

Phase 2 implementation.md Step 3 に移動済み


Lexer パッケージ

Unicode 対応

// 現在
ch byte // ASCII のみ

// 改善後
ch rune // Unicode 対応

Parser パッケージ

for 文のセミコロン処理の見直し

// parser.go:414-420
// parseStatement がセミコロンを消費するため、二重消費の可能性

switch 文の case ブロック形式

// 現在: case 1: { ... } の形式のみ
// 検討: case 1: stmt; の形式もサポートするか

Object パッケージ

Environment の const 再代入ガード

// 現在: SetConst で設定した変数に Set で上書き可能
// 改善: Environment 側でもチェックを追加

AST パッケージ

NumberLiteral の値を数値型に変更

// 現在
type NumberLiteral struct {
    Token token.Token
    Value string  // "42" や "3.14"
}

// 改善後
type NumberLiteral struct {
    Token token.Token
    Value float64  // 数値として保持
}

テストカバレッジの拡充

ForStatement の String() 表現

// "for (; ; ) { }" のような表示
// 仕様との整合性確認が必要

Evaluator パッケージ

break/continue の内部型を隠蔽

// 現在: object.Object を実装している
type breakValue struct{}
func (b *breakValue) Type() object.ObjectType { return "BREAK" }

// 改善: 内部実装として完全に隠蔽するか、object パッケージに移動

無限ループ検出

// while (true) { } や for (;;) { } で無限ループ
// 対策: 実行ステップ数やタイムアウトによる保護

引数の数チェック(警告オプション)

// 現在: 引数が多すぎても無視、少なすぎると NULL
// 改善: 警告を出すオプションを追加

スタックオーバーフロー対策

// 再帰関数の深すぎる呼び出し対策
// 呼び出し深度のトラッキングと制限

組み込み関数のテスト改善

// out, outln, in のテストがない
// io.Writer/io.Reader を注入可能にしてテスト容易性を向上

文字列インデックスのマルチバイト文字対応

// 現在: バイト単位でアクセス(ASCII のみ正しく動作)
return &object.String{Value: string(stringObject.Value[idx])}

// 改善: rune に変換してからアクセス
runes := []rune(stringObject.Value)
return &object.String{Value: string(runes[idx])}

REPL パッケージ

複数行入力対応

// 括弧のバランスをチェックして継続入力を促す
// 例: { を入力後、} が来るまで入力を継続

コマンド履歴機能

入力補完機能

Scanner.Err() のチェック追加

// repl.go
if !scanned {
    if err := scanner.Err(); err != nil {
        // エラー処理
    }
    return
}

RunFile のエラーメッセージ改善

// ファイルが存在しない場合とパーミッションエラーを区別
if os.IsNotExist(err) {
    return fmt.Errorf("file not found: %s", filename)
} else if os.IsPermission(err) {
    return fmt.Errorf("permission denied: %s", filename)
}

将来の機能拡張(優先度順)

重要レベル(スケールするプログラムに必要)

あると便利レベル

上級レベル(本格的な開発に必要)