109 lines
2.9 KiB
Plaintext
109 lines
2.9 KiB
Plaintext
|
|
Nyash言語のwhen構文と関数Box設計について深い相談です
|
|||
|
|
|
|||
|
|
【前回の議論からの進展】
|
|||
|
|
|
|||
|
|
1. when文採用でほぼ決定
|
|||
|
|
- switch/caseより予約語が少ない
|
|||
|
|
- 式としても使える
|
|||
|
|
- パターンマッチングへの拡張性
|
|||
|
|
|
|||
|
|
2. => 構文の導入
|
|||
|
|
- 現代的で見やすい
|
|||
|
|
- 他言語(Rust, Kotlin, JS)でも採用
|
|||
|
|
- 単一式とブロック両対応を検討中
|
|||
|
|
|
|||
|
|
3. returnキーワードは必須!
|
|||
|
|
- 早期リターンに必要
|
|||
|
|
- 明示性のため重要
|
|||
|
|
- 式指向だけでは複雑になりすぎる
|
|||
|
|
|
|||
|
|
【新しい設計提案:fnによる関数Box】
|
|||
|
|
|
|||
|
|
通常のブロックと関数Boxを明示的に区別する案:
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
// 通常のブロック(外側のスコープを共有)
|
|||
|
|
when animal {
|
|||
|
|
"dog" => {
|
|||
|
|
me.count = me.count + 1 // 外側のBoxのme
|
|||
|
|
local sound = "woof"
|
|||
|
|
playSound(sound)
|
|||
|
|
return sound // whenの値として返る
|
|||
|
|
}
|
|||
|
|
"cat" => meow() // 単一式もOK
|
|||
|
|
else => silent()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 関数Box(新しいスコープ、再帰可能)
|
|||
|
|
when operation {
|
|||
|
|
"factorial" => fn(n) {
|
|||
|
|
if n <= 1 { return 1 }
|
|||
|
|
return n * me(n - 1) // meは新しい関数Box自身!
|
|||
|
|
}(5) // 即座に呼び出し
|
|||
|
|
|
|||
|
|
"counter" => fn() {
|
|||
|
|
local count = 0
|
|||
|
|
return {
|
|||
|
|
increment: fn() { count = count + 1 },
|
|||
|
|
get: fn() { return count }
|
|||
|
|
}
|
|||
|
|
}()
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
【質問事項】
|
|||
|
|
|
|||
|
|
1. when vs match
|
|||
|
|
- whenという名前で良いか?
|
|||
|
|
- matchの方が良い?
|
|||
|
|
- 他の候補:check, on, select
|
|||
|
|
|
|||
|
|
2. => 構文の詳細設計
|
|||
|
|
- 単一式:`"dog" => bark()`
|
|||
|
|
- ブロック:`"dog" => { ... }`
|
|||
|
|
- 関数Box:`"dog" => fn(args) { ... }`
|
|||
|
|
- この3パターンで十分か?
|
|||
|
|
|
|||
|
|
3. fnキーワードの役割拡張
|
|||
|
|
- 現在:関数定義のみ
|
|||
|
|
- 提案:インライン関数Box作成にも使用
|
|||
|
|
- 一貫性は保たれるか?
|
|||
|
|
|
|||
|
|
4. Everything is Box哲学との整合性
|
|||
|
|
- {} だけでは通常のブロック(Boxではない)
|
|||
|
|
- fn{} で関数Box
|
|||
|
|
- この区別は哲学に反しないか?
|
|||
|
|
|
|||
|
|
5. 実装の観点
|
|||
|
|
- MIR/VM/LLVMでの実装難易度
|
|||
|
|
- 最適化の可能性
|
|||
|
|
- デバッグのしやすさ
|
|||
|
|
|
|||
|
|
【設計原則の確認】
|
|||
|
|
|
|||
|
|
- 明示性:何が起きているか一目瞭然
|
|||
|
|
- シンプルさ:初学者にも分かりやすい
|
|||
|
|
- 表現力:実用的なプログラムが書ける
|
|||
|
|
- 一貫性:言語全体で統一感がある
|
|||
|
|
|
|||
|
|
【予約語リスト(案)】
|
|||
|
|
必須機能に必要な最小限:
|
|||
|
|
1. box
|
|||
|
|
2. new
|
|||
|
|
3. me
|
|||
|
|
4. public
|
|||
|
|
5. if
|
|||
|
|
6. else
|
|||
|
|
7. loop
|
|||
|
|
8. break
|
|||
|
|
9. continue
|
|||
|
|
10. when (またはmatch)
|
|||
|
|
11. return
|
|||
|
|
12. import
|
|||
|
|
13. from
|
|||
|
|
14. birth (コンストラクタ)
|
|||
|
|
15. fn
|
|||
|
|
|
|||
|
|
予約語10個厳守ではなく、必要なものは追加する方針です。
|
|||
|
|
|
|||
|
|
プログラミング言語設計の観点から、この設計の妥当性と改善案をお聞かせください。
|