solve the id-pocalypse (don't recursively execute subs of defun and cond)

master
cynic 3 years ago
parent cb81efc544
commit 6beeb3beba
  1. 22
      lib.py
  2. 6
      lib/aids.klambda
  3. 12
      test.klambda

@ -49,11 +49,17 @@ def execute(program):
else: else:
return ("identifier", item) return ("identifier", item)
if type(ctx) == type([]) and ctx[0][0] == "identifier": if type(ctx) == type([]) and ctx[0][0] == "identifier":
subs = list(
map(lambda a: _execute(a), ctx)
)
_fixarr(subs)
#print("abba", ctx, subs) #print("abba", ctx, subs)
if ctx[0] == _ident("defun"):
funcspace[ctx[1]] = ctx[2]
return funcspace[ctx[1]]
elif ctx[0] == _ident("cond"):
return _execute(ctx[2]) if _truthy(_execute(ctx[1])) else _execute(ctx[3])
subs = _fixarr(list(map(lambda a: _execute(a), ctx)))
if ctx[0][1][0] == "$": if ctx[0][1][0] == "$":
return subs return subs
elif ctx[0][1] == "id": elif ctx[0][1] == "id":
@ -65,6 +71,8 @@ def execute(program):
return idspace[subs[1]] return idspace[subs[1]]
elif ctx[0] == _ident("+"): elif ctx[0] == _ident("+"):
return (subs[1][0], subs[1][1]+subs[2][1]) return (subs[1][0], subs[1][1]+subs[2][1])
elif ctx[0] == _ident("%"):
return (subs[1][0], subs[1][1]%subs[2][1])
elif ctx[0] == _ident("=="): elif ctx[0] == _ident("=="):
return ("number", 1.0 if subs[1] == subs[2] else 0.0) return ("number", 1.0 if subs[1] == subs[2] else 0.0)
elif ctx[0] == _ident("="): elif ctx[0] == _ident("="):
@ -73,12 +81,8 @@ def execute(program):
return ("number", 1.0 if subs[1][1] > subs[2][1] else 0.0) return ("number", 1.0 if subs[1][1] > subs[2][1] else 0.0)
elif ctx[0] == _ident("<"): elif ctx[0] == _ident("<"):
return ("number", 1.0 if subs[1][1] < subs[2][1] else 0.0) return ("number", 1.0 if subs[1][1] < subs[2][1] else 0.0)
elif ctx[0] == _ident("defun"):
funcspace[subs[1]] = subs[2]
return funcspace[subs[1]]
elif ctx[0] == _ident("cond"):
return _execute(subs[2]) if _truthy(_execute(subs[1])) else _execute(subs[3])
elif ctx[0] == _ident("conv"): elif ctx[0] == _ident("conv"):
print(subs)
return (subs[1][1], float(subs[2][1]) if subs[1][1] == "number" else str(subs[2][1])) return (subs[1][1], float(subs[2][1]) if subs[1][1] == "number" else str(subs[2][1]))
elif ctx[0] == _ident("all"): elif ctx[0] == _ident("all"):
ret = _execute(subs[1]) ret = _execute(subs[1])

@ -2,14 +2,14 @@
: i'm hilarious. : i'm hilarious.
(defun spit (defun spit
(id miracle (miracle
"builtins" "print" (id $1)) "builtins" "print" (id $1))
) )
(defun input (defun input
(id miracle (miracle
"builtins" "input" ("")) "builtins" "input" (""))
) )
(defun thesis (defun thesis
(id spit (spit
("this language belongs to makise kurisu. there are many like it, but this one is hers.")) ("this language belongs to makise kurisu. there are many like it, but this one is hers."))
) )

@ -15,18 +15,18 @@ INCLUDE:./lib/aids.klambda
(spit (spit
( (
(cond (> age 18) (cond (> age 18)
"adult" "adult (hag)"
"not adult" "not adult (uoh)"
) )
) )
) )
(defun loop (defun loop
(id all (all
(id id spit ($1)) (spit ($1))
(id id cond (id id id = $1 $2) (cond (= $1 $2)
$1 $1
(id id id loop (id id id id + $1 1) $2) (loop (+ $1 1) $2)
) )
) )
) )

Loading…
Cancel
Save