各 Phase のレビューで発見された課題をまとめたもの。 Phase 実装計画(implementation.md)に移動した項目は削除する。
詳細は後述の「REPL パッケージ」セクションを参照
詳細は後述の各パッケージセクションを参照
../ などを使った悪意あるパスへのアクセスが可能breakValue や continueValue と同様の問題arr[-1])arr[0] = 10)arr[1:3]){})
{} は空マップとしてパースされるmap["key"] = value)0.0 vs -0.0)
NaN 同士も異なるハッシュになる可能性concat() / append() 関数未実装contains() / includes() 関数未実装keys() / values() の順序が不定
Phase 2 implementation.md Step 3 に移動済み
// 現在
ch byte // ASCII のみ
// 改善後
ch rune // Unicode 対応
readChar(), peekChar(), isLetter() の変更が必要// parser.go:414-420
// parseStatement がセミコロンを消費するため、二重消費の可能性
// 現在: case 1: { ... } の形式のみ
// 検討: case 1: stmt; の形式もサポートするか
// 現在: SetConst で設定した変数に Set で上書き可能
// 改善: Environment 側でもチェックを追加
// 現在
type NumberLiteral struct {
Token token.Token
Value string // "42" や "3.14"
}
// 改善後
type NumberLiteral struct {
Token token.Token
Value float64 // 数値として保持
}
// "for (; ; ) { }" のような表示
// 仕様との整合性確認が必要
// 現在: 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])}
"あいう"[1] が正しく "い" を返すようになる// 括弧のバランスをチェックして継続入力を促す
// 例: { を入力後、} が来るまで入力を継続
// repl.go
if !scanned {
if err := scanner.Err(); err != nil {
// エラー処理
}
return
}
// ファイルが存在しない場合とパーミッションエラーを区別
if os.IsNotExist(err) {
return fmt.Errorf("file not found: %s", filename)
} else if os.IsPermission(err) {
return fmt.Errorf("permission denied: %s", filename)
}
import で他のファイルを読み込む