Files
hakorune/examples/lisp/lisp_basic_ops.hako

137 lines
3.5 KiB
Plaintext
Raw Permalink 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.

// 🔧 LISP基本操作関数実装
// atom?, equal?, null? など
NIL = 0
// atom? - アトム(非リスト)かどうかをチェック
function atomP(obj) {
if obj == NIL { return true } // nilはアトム
// 数値はアトム
if obj == 0 { return true }
if obj == 1 { return true }
if obj == 2 { return true }
if obj == 3 { return true }
if obj == 4 { return true }
if obj == 5 { return true }
if obj == 6 { return true }
if obj == 7 { return true }
if obj == 8 { return true }
if obj == 9 { return true }
// 文字列はアトム
if obj == "a" { return true }
if obj == "b" { return true }
if obj == "c" { return true }
if obj == "" { return true }
if obj == "nil" { return true }
if obj == "foo" { return true }
if obj == "bar" { return true }
// SymbolBoxはアトム簡易実装
// 実際には型チェックが必要だが、Nyashでは限定的
// ConsBoxでなければアトムと仮定
return false // ConsBox以外は全てアトム扱い
}
// equal? - 深い等価性チェック
function equalP(a, b) {
// 同じオブジェクトなら等価
if a == b { return true }
// nilのチェック
if a == NIL and b == NIL { return true }
if a == NIL or b == NIL { return false }
// アトム同士の比較
if atomP(a) and atomP(b) {
return a == b
}
// 両方がリストの場合(再帰的に比較)
if not atomP(a) and not atomP(b) {
// car部分を比較
if not equalP(car(a), car(b)) {
return false
}
// cdr部分を比較
return equalP(cdr(a), cdr(b))
}
// 片方がアトム、片方がリストなら等価でない
return false
}
// null? - nilかどうかをチェック
function nullP(obj) {
return obj == NIL
}
// length - リストの長さを計算
function lengthList(lst) {
if lst == NIL { return 0 }
if atomP(lst) { return 0 } // アトムは長さ0
return 1 + lengthList(cdr(lst))
}
// append - 2つのリストを連結
function append(lst1, lst2) {
if lst1 == NIL { return lst2 }
return cons(car(lst1), append(cdr(lst1), lst2))
}
// reverse - リストを逆順にする
function reverse(lst) {
return reverseHelper(lst, NIL)
}
function reverseHelper(lst, acc) {
if lst == NIL { return acc }
return reverseHelper(cdr(lst), cons(car(lst), acc))
}
// ConsBoxとSymbolBoxのインポート概念的
// 実際のファイルでは include を使用する想定
// テスト用の簡易cons/car/cdr仮実装
function cons(a, d) {
// ConsBoxが利用可能な場合
result = "ConsBox実装が必要"
return result
}
function car(pair) {
if pair == NIL { return NIL }
return "car実装が必要"
}
function cdr(pair) {
if pair == NIL { return NIL }
return "cdr実装が必要"
}
// テスト
print("=== LISP Basic Operations Test ===")
print("")
// atomP テスト
print("1. atomP tests:")
print(" atomP(42): " + atomP(42))
print(" atomP(NIL): " + atomP(NIL))
print(" atomP('hello'): " + atomP("hello"))
print("")
print("2. equalP tests:")
print(" equalP(42, 42): " + equalP(42, 42))
print(" equalP(42, 43): " + equalP(42, 43))
print(" equalP(NIL, NIL): " + equalP(NIL, NIL))
print(" equalP('a', 'a'): " + equalP("a", "a"))
print("")
print("3. nullP tests:")
print(" nullP(NIL): " + nullP(NIL))
print(" nullP(42): " + nullP(42))
print("")
print("✅ Basic operations test done!")
print("💡 Next: Implement with real ConsBox integration")