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