Files
hakorune/docs/development/roadmap/phases/phase-12.7/archive/powerful-syntax-sugar-proposals.txt

297 lines
8.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

================================================================================
Nyash つよつよ糖衣構文提案 - 自己ホスティングに向けて
2025-09-03
================================================================================
【背景】
自己ホスティングNyashでNyashコンパイラを書くを実現するため、
コード量を劇的に削減できる強力な糖衣構文を検討する。
================================================================================
1. パイプライン演算子 |> (優先度:最高)
================================================================================
【現在の問題】
// ネストが深くて読みにくい
local result = trim(uppercase(replace(input, "cat", "nyan")))
【提案構文】
local result = input
|> replace($, "cat", "nyan")
|> uppercase($)
|> trim($)
// $ は前の結果を表す特殊変数
// または第一引数に自動挿入も可
local result = input
|> replace("cat", "nyan") // 第一引数に自動挿入
|> uppercase()
|> trim()
【効果】
- AST変換処理が非常に読みやすくなる
- 関数合成が直感的
- デバッグ時に中間結果を確認しやすい
================================================================================
2. 分割代入Destructuring優先度
================================================================================
【基本形】
// タプル分割
local (x, y, z) = getCoordinates()
// Box分割
local { name, age, email } = getUserInfo()
// 配列分割
local [first, second, ...rest] = items
【peek内での構造体パターン】
peek ast {
BinaryOp(left, op, right) => {
// left, op, right が自動的に変数として使える
compile(left) + compile(op) + compile(right)
}
UnaryOp(op, expr) => {
compile(op) + compile(expr)
}
Literal(value) => value.toString()
}
【効果】
- パーサー実装で威力発揮
- ASTードの処理が簡潔に
- ボイラープレートコード削減
================================================================================
3. null安全演算子 ?. と ?? (優先度:高)
================================================================================
【?.null安全アクセス
// 現在
local name
if user != null {
if user.profile != null {
if user.profile.name != null {
name = user.profile.name
}
}
}
// 提案
local name = user?.profile?.name
【??null合体演算子
local displayName = user?.name ?? "Anonymous"
local port = config?.server?.port ?? 8080
【組み合わせ】
local result = getData()?.process()?.format() ?? "default"
【効果】
- null/undefinedエラーの防止
- 防御的プログラミングが簡潔に
- 設定値の読み込みで特に有用
================================================================================
4. 文字列テンプレート強化(優先度:高)
================================================================================
【基本テンプレート】
// 現在
local msg = "Error at line " + line + ", column " + col + ": " + error
// 提案
local msg = `Error at line ${line}, column ${col}: ${error}`
【複数行テンプレート】
local code = ```
fn ${name}(${params.join(", ")}) {
${body.indent(4)}
}
```
【タグ付きテンプレート(将来)】
local sql = SQL`SELECT * FROM users WHERE id = ${userId}`
local regex = RE`\d{3}-\d{4}` // エスケープ不要
【効果】
- コード生成が劇的に簡単に
- SQLやHTML生成で安全性向上
- 可読性の大幅改善
================================================================================
5. リスト内包表記(優先度:中)
================================================================================
【基本形】
// 現在
local result = new ArrayBox()
for item in list {
if item.isValid() {
result.push(item.process())
}
}
// 提案
local result = [item.process() for item in list if item.isValid()]
【ネスト】
local pairs = [(x, y) for x in xs for y in ys if x != y]
【辞書内包】
local map = {key: value.process() for (key, value) in entries}
【効果】
- 変換処理が1行で書ける
- 関数型プログラミングスタイル
- メモリ効率的な実装も可能
================================================================================
6. for式値を返すfor優先度
================================================================================
【基本形】
local tokens = for token in input yield parseToken(token)
【フィルタ付き】
local validTokens = for token in tokens if token.isValid() yield token
【変換付き】
local ast = for line in lines {
local trimmed = line.trim()
if trimmed.length() > 0 {
yield parseLine(trimmed)
}
}
【効果】
- リスト内包より複雑な処理に対応
- 中間変数を使える
- yieldで明示的
================================================================================
7. スプレッド演算子 ... (優先度:中)
================================================================================
【配列展開】
local combined = [...array1, ...array2, newItem]
local clone = [...original]
【Box展開】
local updated = { ...oldConfig, debug: true, port: 8080 }
【関数引数展開】
processItems(...args)
local max = Math.max(...numbers)
【効果】
- 配列・オブジェクト操作が簡潔
- イミュータブルな更新が簡単
- 可変長引数の処理
================================================================================
8. with文リソース管理優先度
================================================================================
【基本形】
with file = openFile("data.txt") {
local content = file.read()
process(content)
} // 自動的にfile.close()
【複数リソース】
with db = connectDB(), file = openLog() {
db.query("SELECT...")
file.write(result)
} // 両方自動クローズ
【効果】
- リソースリークの防止
- finally不要
- RAII的な管理
================================================================================
9. 関数合成演算子(優先度:低)
================================================================================
【合成 >>】
local processLine = trim >> lowercase >> tokenize
local result = processLine(input)
【部分適用】
local add5 = add(5, _)
local result = add5(10) // 15
【カリー化】
local multiply = fn(a)(b) => a * b
local double = multiply(2)
【効果】
- 関数型プログラミング支援
- 高階関数の活用
- コードの再利用性向上
================================================================================
10. 強力なpeekパターン拡張優先度
================================================================================
【ガード】
peek value {
n if n > 0 => "positive"
n if n < 0 => "negative"
0 => "zero"
}
【範囲】
peek score {
0..60 => "F"
60..70 => "D"
70..80 => "C"
80..90 => "B"
90..100 => "A"
}
【深いパターン】
peek ast {
If({ condition: BinaryOp(_, "==", _), then, else }) => {
optimizeEquality(condition, then, else)
}
}
【効果】
- より表現力豊かな分岐
- コンパイラ実装で必須
- コードの意図が明確
================================================================================
実装優先順位まとめ
================================================================================
【Phase 13次フェーズ
1. パイプライン演算子 |>
2. 分割代入(基本形のみ)
3. null安全演算子 ?. と ??
4. 文字列テンプレート `${}`
【Phase 14】
5. リスト内包表記
6. for式
7. peekパターン拡張ガード
【Phase 15以降】
8. スプレッド演算子
9. with文
10. 関数合成演算子
================================================================================
実装時の注意点
================================================================================
1. 各糖衣構文は既存構文へのデシュガーとして実装
2. エラーメッセージは元の構文で表示
3. デバッガーでのステップ実行に配慮
4. 段階的に導入(基本形→拡張形)
================================================================================