diff --git a/lib.py b/lib.py index 28659eb..0ecc7b4 100644 --- a/lib.py +++ b/lib.py @@ -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() diff --git a/main.py b/main.py index 2e6759c..4cf5da0 100644 --- a/main.py +++ b/main.py @@ -129,5 +129,4 @@ program = structurize(lex(tokenize(f))) #print(program) -for strand in program: - lib.execute(strand) +lib.execute(program) diff --git a/test.klambda b/test.klambda index f0aae34..7b0691d 100644 --- a/test.klambda +++ b/test.klambda @@ -20,4 +20,15 @@ (id spit ("one")) (id spit ("zero")) ) -(thesis) \ No newline at end of file +(thesis) + +(spit ("how old are you? > ")) +(def age (conv number (input))) +(spit + ( + (cond (> age 18) + "adult" + "not adult" + ) + ) +) \ No newline at end of file