conv + gt & lt + fixed miracle returns

master
cynic 3 years ago
parent 98747e6df3
commit d7b423c78a
  1. 29
      lib.py
  2. 3
      main.py
  3. 13
      test.klambda

@ -5,7 +5,8 @@
idspace = {}
funcspace = {}
def execute(ctx):
def execute(program):
import traceback
def _execute(ctx):
import sys, functools
def _ident(name):
@ -14,7 +15,7 @@ def execute(ctx):
return t[1] if t[0] == "string" else ""
def _fixarr(a):
for i in a:
if i[0] == "identifier":
if i[0] == "identifier" and i in idspace:
a[a.index(i)] = idspace[i]
return a
def _recursereplace(i, fr, to):
@ -39,15 +40,23 @@ def execute(ctx):
return good
else:
return False
def _box(item):
if type(item) == type(0) or type(item) == type(0.0):
return ("number", item)
elif type(item) == type(""):
return ("string", item)
else:
return ("identifier", item)
if type(ctx) == type([]) and ctx[0][0] == "identifier":
subs = list(
map(lambda a: _execute(a), ctx)
)
_fixarr(subs)
#print("abba", ctx, subs)
if ctx[0][1] == "id":
return subs[1] if len(subs[1:]) == 1 else subs[1:]
elif ctx[0] == _ident("miracle"):
return getattr(sys.modules[_destr(subs[1])], _destr(subs[2]))(*[i[1] for i in _fixarr(subs[3])])
return _box(getattr(sys.modules[_destr(subs[1])], _destr(subs[2]))(*[i[1] for i in _fixarr(subs[3])]))
elif ctx[0] == _ident("def"):
idspace[subs[1]] = subs[2]
return idspace[subs[1]]
@ -57,11 +66,17 @@ def execute(ctx):
return ("number", 1.0 if subs[1] == subs[2] else 0.0)
elif ctx[0] == _ident("="):
return ("number", 1.0 if str(float(subs[1][1])) == str(float(subs[2][1])) else 0.0)
elif ctx[0] == _ident(">"):
return ("number", 1.0 if subs[1][1] > subs[2][1] else 0.0)
elif ctx[0] == _ident("<"):
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"):
return (subs[1][1], float(subs[2][1]) if subs[1][1] == "number" else str(subs[2][1]))
elif ctx[0] in funcspace:
prototype = funcspace[ctx[0]]
for idx, arg in enumerate(subs[1:]):
@ -80,7 +95,13 @@ def execute(ctx):
map(lambda a: _execute(a), ctx)
)
return ctx
_execute(ctx)
for strand in program:
# try: _execute(strand)
_execute(strand)
# except Exception as e:
# print("failed in", strand, "with", e)
# traceback.print_stack()
# exit()
#input()

@ -129,5 +129,4 @@ program = structurize(lex(tokenize(f)))
#print(program)
for strand in program:
lib.execute(strand)
lib.execute(program)

@ -20,4 +20,15 @@
(id spit ("one"))
(id spit ("zero"))
)
(thesis)
(thesis)
(spit ("how old are you? > "))
(def age (conv number (input)))
(spit
(
(cond (> age 18)
"adult"
"not adult"
)
)
)
Loading…
Cancel
Save