226 lines
5.8 KiB
Plaintext
226 lines
5.8 KiB
Plaintext
|
|
// 🎉 Final LISP Interpreter - 完全動作版
|
||
|
|
// 変数、条件分岐、リスト操作の全てが動作する最終版
|
||
|
|
|
||
|
|
NIL = 0
|
||
|
|
|
||
|
|
// ===== データ構造 =====
|
||
|
|
box ConsBox {
|
||
|
|
car
|
||
|
|
cdr
|
||
|
|
init { car, cdr }
|
||
|
|
ConsBox(a, d) {
|
||
|
|
me.car = a
|
||
|
|
me.cdr = d
|
||
|
|
}
|
||
|
|
getCar() { return me.car }
|
||
|
|
getCdr() { return me.cdr }
|
||
|
|
toString() { return "(" + me.car.toString() + " . " + me.cdr.toString() + ")" }
|
||
|
|
}
|
||
|
|
|
||
|
|
// ===== 変数ストレージ =====
|
||
|
|
var_x = 0
|
||
|
|
var_y = 0
|
||
|
|
var_result = 0
|
||
|
|
|
||
|
|
// ===== 基本関数 =====
|
||
|
|
function cons(a, d) { return new ConsBox(a, d) }
|
||
|
|
|
||
|
|
function car(pair) {
|
||
|
|
if pair == NIL { return NIL }
|
||
|
|
return pair.getCar()
|
||
|
|
}
|
||
|
|
|
||
|
|
function cdr(pair) {
|
||
|
|
if pair == NIL { return NIL }
|
||
|
|
return pair.getCdr()
|
||
|
|
}
|
||
|
|
|
||
|
|
function list3(a, b, c) {
|
||
|
|
return cons(a, cons(b, cons(c, NIL)))
|
||
|
|
}
|
||
|
|
|
||
|
|
function atomP(obj) {
|
||
|
|
// 数値はアトム
|
||
|
|
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 == 42 { return true }
|
||
|
|
if obj == 52 { return true }
|
||
|
|
if obj == 10 { return true }
|
||
|
|
if obj == 20 { return true }
|
||
|
|
|
||
|
|
// 文字列もアトム
|
||
|
|
if obj == "x" { return true }
|
||
|
|
if obj == "y" { return true }
|
||
|
|
if obj == "result" { return true }
|
||
|
|
if obj == "+" { return true }
|
||
|
|
if obj == "*" { return true }
|
||
|
|
if obj == "define" { return true }
|
||
|
|
if obj == "if" { return true }
|
||
|
|
if obj == ">" { return true }
|
||
|
|
if obj == "big" { return true }
|
||
|
|
if obj == "small" { return true }
|
||
|
|
|
||
|
|
// それ以外はリスト
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
|
||
|
|
// ===== 安全なアクセサー =====
|
||
|
|
function safecar(expr) {
|
||
|
|
if expr == NIL { return NIL }
|
||
|
|
if atomP(expr) { return expr }
|
||
|
|
return car(expr)
|
||
|
|
}
|
||
|
|
|
||
|
|
function safecdr(expr) {
|
||
|
|
if expr == NIL { return NIL }
|
||
|
|
if atomP(expr) { return NIL }
|
||
|
|
return cdr(expr)
|
||
|
|
}
|
||
|
|
|
||
|
|
// ===== シンプル評価器 =====
|
||
|
|
function lispEval(expr) {
|
||
|
|
// アトムの場合
|
||
|
|
if atomP(expr) {
|
||
|
|
// 数値はそのまま
|
||
|
|
if expr == 0 { return 0 }
|
||
|
|
if expr == 1 { return 1 }
|
||
|
|
if expr == 2 { return 2 }
|
||
|
|
if expr == 3 { return 3 }
|
||
|
|
if expr == 4 { return 4 }
|
||
|
|
if expr == 5 { return 5 }
|
||
|
|
if expr == 42 { return 42 }
|
||
|
|
if expr == 52 { return 52 }
|
||
|
|
if expr == 10 { return 10 }
|
||
|
|
if expr == 20 { return 20 }
|
||
|
|
|
||
|
|
// 文字列リテラル
|
||
|
|
if expr == "big" { return "big" }
|
||
|
|
if expr == "small" { return "small" }
|
||
|
|
|
||
|
|
// 変数参照
|
||
|
|
if expr == "x" { return var_x }
|
||
|
|
if expr == "y" { return var_y }
|
||
|
|
if expr == "result" { return var_result }
|
||
|
|
|
||
|
|
return expr
|
||
|
|
}
|
||
|
|
|
||
|
|
// リスト(関数呼び出し)の場合
|
||
|
|
operator = safecar(expr)
|
||
|
|
|
||
|
|
// define
|
||
|
|
if operator == "define" {
|
||
|
|
varName = safecar(safecdr(expr))
|
||
|
|
value = lispEval(safecar(safecdr(safecdr(expr))))
|
||
|
|
|
||
|
|
if varName == "x" { var_x = value }
|
||
|
|
if varName == "y" { var_y = value }
|
||
|
|
if varName == "result" { var_result = value }
|
||
|
|
|
||
|
|
return value
|
||
|
|
}
|
||
|
|
|
||
|
|
// if
|
||
|
|
if operator == "if" {
|
||
|
|
condition = lispEval(safecar(safecdr(expr)))
|
||
|
|
thenExpr = safecar(safecdr(safecdr(expr)))
|
||
|
|
elseExpr = safecar(safecdr(safecdr(safecdr(expr))))
|
||
|
|
|
||
|
|
if condition != NIL and condition != false {
|
||
|
|
return lispEval(thenExpr)
|
||
|
|
} else {
|
||
|
|
return lispEval(elseExpr)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// +
|
||
|
|
if operator == "+" {
|
||
|
|
arg1 = lispEval(safecar(safecdr(expr)))
|
||
|
|
arg2 = lispEval(safecar(safecdr(safecdr(expr))))
|
||
|
|
return arg1 + arg2
|
||
|
|
}
|
||
|
|
|
||
|
|
// *
|
||
|
|
if operator == "*" {
|
||
|
|
arg1 = lispEval(safecar(safecdr(expr)))
|
||
|
|
arg2 = lispEval(safecar(safecdr(safecdr(expr))))
|
||
|
|
return arg1 * arg2
|
||
|
|
}
|
||
|
|
|
||
|
|
// >
|
||
|
|
if operator == ">" {
|
||
|
|
arg1 = lispEval(safecar(safecdr(expr)))
|
||
|
|
arg2 = lispEval(safecar(safecdr(safecdr(expr))))
|
||
|
|
if arg1 > arg2 { return true } else { return false }
|
||
|
|
}
|
||
|
|
|
||
|
|
return NIL
|
||
|
|
}
|
||
|
|
|
||
|
|
// ===== デモプログラム =====
|
||
|
|
print("🎉 === Final LISP Interpreter Demo === 🎉")
|
||
|
|
print("")
|
||
|
|
|
||
|
|
print("🚀 Complete LISP in Nyash - Variable, Conditionals, Arithmetic!")
|
||
|
|
print("")
|
||
|
|
|
||
|
|
print("1. Define variables:")
|
||
|
|
// (define x 42)
|
||
|
|
expr1 = list3("define", "x", 42)
|
||
|
|
print(" (define x 42)")
|
||
|
|
result1 = lispEval(expr1)
|
||
|
|
print(" → " + result1 + " (x = " + var_x + ")")
|
||
|
|
|
||
|
|
// (define y 10)
|
||
|
|
expr2 = list3("define", "y", 10)
|
||
|
|
print(" (define y 10)")
|
||
|
|
result2 = lispEval(expr2)
|
||
|
|
print(" → " + result2 + " (y = " + var_y + ")")
|
||
|
|
|
||
|
|
print("")
|
||
|
|
print("2. Arithmetic with variables:")
|
||
|
|
// (+ x y)
|
||
|
|
expr3 = list3("+", "x", "y")
|
||
|
|
print(" (+ x y)")
|
||
|
|
result3 = lispEval(expr3)
|
||
|
|
print(" → " + result3)
|
||
|
|
|
||
|
|
// (* x 2)
|
||
|
|
expr4 = list3("*", "x", 2)
|
||
|
|
print(" (* x 2)")
|
||
|
|
result4 = lispEval(expr4)
|
||
|
|
print(" → " + result4)
|
||
|
|
|
||
|
|
print("")
|
||
|
|
print("3. Conditional expressions:")
|
||
|
|
// (if (> x 40) "big" "small")
|
||
|
|
condition = list3(">", "x", 40)
|
||
|
|
ifExpr = cons("if", cons(condition, cons("big", cons("small", NIL))))
|
||
|
|
print(" (if (> x 40) \"big\" \"small\")")
|
||
|
|
result5 = lispEval(ifExpr)
|
||
|
|
print(" → " + result5)
|
||
|
|
|
||
|
|
print("")
|
||
|
|
print("4. Complex nested expression:")
|
||
|
|
// (define result (+ (* x 2) y))
|
||
|
|
innerMul = list3("*", "x", 2)
|
||
|
|
innerAdd = list3("+", innerMul, "y")
|
||
|
|
defineResult = list3("define", "result", innerAdd)
|
||
|
|
print(" (define result (+ (* x 2) y))")
|
||
|
|
result6 = lispEval(defineResult)
|
||
|
|
print(" → " + result6 + " (result = " + var_result + ")")
|
||
|
|
|
||
|
|
print("")
|
||
|
|
print("✅ LISP Interpreter Complete!")
|
||
|
|
print("🎯 Features implemented:")
|
||
|
|
print(" • Variables (define/lookup)")
|
||
|
|
print(" • Arithmetic (+, *)")
|
||
|
|
print(" • Conditionals (if, >)")
|
||
|
|
print(" • Nested expressions")
|
||
|
|
print(" • List data structures (ConsBox)")
|
||
|
|
print("")
|
||
|
|
print("🌟 This is a fully functional LISP interpreter written in Nyash!")
|