Files
hakorune/examples/lisp/cons_box_v3.nyash
Moe Charm 0bed0c0271 🎉 initial commit: Nyash Programming Language完成版
🚀 主要機能:
• Everything is Box哲学による革新的アーキテクチャ
• WebAssemblyブラウザー対応プレイグラウンド
• アーティスト協同制作デモ - 複数Boxインスタンス実証
• 視覚的デバッグシステム - DebugBox完全統合
• static box Mainパターン - メモリ安全設計

 言語機能:
• NOT/AND/OR/除算演算子完全実装
• ジェネリクス/テンプレートシステム
• 非同期処理(nowait/await)
• try/catchエラーハンドリング
• Canvas統合グラフィックス

🎨 ブラウザー体験:
• 9種類のインタラクティブデモ
• リアルタイムコード実行
• WebCanvas/WebConsole/WebDisplay
• モバイル対応完了

🤖 Built with Claude Code collaboration
Ready for public release!
2025-08-09 15:14:44 +09:00

158 lines
3.5 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.

// 📦 ConsBox - LISPのcons cell実装 v3
// 🎉 コンストラクタ引数サポート版!
// NilBox - null値の代替実装
box NilBox {
init {}
isNil() { return true }
toString() { return "nil" }
}
// グローバルなnil値
NIL = new NilBox()
// nil判定関数
function isNil(value) {
if value == 0 { return true }
if value == NIL { return true }
// NilBoxインスタンスかチェック型安全
// InstanceBoxのみフィールドアクセス可能
return false // 他の値はnilではない
}
box ConsBox {
car
cdr
init { car, cdr }
// 🎉 NEW: コンストラクタ引数対応!
ConsBox(a, d) {
me.car = a
me.cdr = d
}
// 引数なしコンストラクタ
ConsBox() {
me.car = NIL
me.cdr = NIL
}
getCar() { return me.car }
getCdr() { return me.cdr }
setCar(value) { me.car = value }
setCdr(value) { me.cdr = value }
// リスト形式の文字列表現
toString() {
return me.toStringHelper(true)
}
toStringHelper(isFirst) {
result = ""
if isFirst { result = "(" }
// car部分の処理
if isNil(me.car) {
result = result + "nil"
} else {
result = result + me.car
}
// cdr部分の処理
if isNil(me.cdr) {
result = result + ")"
} else {
// ドット対として表示(シンプル版)
result = result + " . " + me.cdr + ")"
}
return result
}
}
// ファクトリー関数(後方互換性のため残す)
function cons(car, cdr) {
return new ConsBox(car, cdr)
}
// リスト作成ヘルパー
function list() {
// 引数なしの場合は空リスト
return NIL
}
function list1(a) {
return new ConsBox(a, NIL)
}
function list2(a, b) {
return new ConsBox(a, new ConsBox(b, NIL))
}
function list3(a, b, c) {
return new ConsBox(a, new ConsBox(b, new ConsBox(c, NIL)))
}
// car/cdr アクセサ関数
function car(pair) {
if isNil(pair) { return NIL }
return pair.getCar()
}
function cdr(pair) {
if isNil(pair) { return NIL }
return pair.getCdr()
}
// テストコード
print("🎯 === ConsBox v3 Test (Constructor Args!) ===")
print("")
// 基本的なペア(コンストラクタ引数使用)
print("1. Basic cons cell with constructor args:")
pair1 = new ConsBox(1, 2)
print(" new ConsBox(1, 2) = " + pair1.toString())
// リスト作成
print("")
print("2. List creation:")
list_a = list1("hello")
print(" (list 'hello') = " + list_a.toString())
list_b = list2(10, 20)
print(" (list 10 20) = " + list_b.toString())
list_c = list3("a", "b", "c")
print(" (list 'a' 'b' 'c') = " + list_c.toString())
// car/cdr操作
print("")
print("3. car/cdr operations:")
test = new ConsBox(42, "world")
print(" test = " + test.toString())
print(" (car test) = " + car(test))
print(" (cdr test) = " + cdr(test))
// ネストしたリスト
print("")
print("4. Nested lists:")
inner = new ConsBox(1, new ConsBox(2, NIL))
outer = new ConsBox(inner, new ConsBox(3, NIL))
print(" ((1 2) 3) = " + outer.toString())
// 空リスト
print("")
print("5. Empty list:")
empty = NIL
print(" '() = " + empty.toString())
// nil要素を含むリスト
print("")
print("6. List with nil:")
list_with_nil = new ConsBox(1, new ConsBox(NIL, new ConsBox(3, NIL)))
print(" (1 nil 3) = " + list_with_nil.toString())
print("")
print("✅ ConsBox v3 tests completed!")