From 395943ca538d3a5762d17cdea300d58391392321 Mon Sep 17 00:00:00 2001 From: Paul Tagliamonte Date: Sat, 22 Dec 2012 00:18:37 -0500 Subject: [PATCH] some hacking --- .gitignore | 2 + eg/repl.hy | 1 - hy/compiler/modfaker.py | 147 +++------------------------------------- hy/lang/builtins.py | 5 +- hy/lang/hyobj.py | 11 +++ hy/lang/natives.py | 141 ++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 7 files changed, 166 insertions(+), 142 deletions(-) create mode 100644 hy/lang/natives.py diff --git a/.gitignore b/.gitignore index 68bd778..7a6bdc2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ *hy*egg* .tox *pycache* +dist +.coverage diff --git a/eg/repl.hy b/eg/repl.hy index a91b5a9..e57cc71 100644 --- a/eg/repl.hy +++ b/eg/repl.hy @@ -2,6 +2,5 @@ ; Copyright (c) Paul Tagliamonte, in sofar as any of this is at all ; copyrightable. - (loop (print (eval (read)))) ; Yes folks, this is where REPL comes from. diff --git a/hy/compiler/modfaker.py b/hy/compiler/modfaker.py index f776e4d..d2a22cd 100644 --- a/hy/compiler/modfaker.py +++ b/hy/compiler/modfaker.py @@ -5,156 +5,27 @@ import imp def _add_native_methods(mod): def shim(): - from hy.lang.bool import HYBool - from hy.lex.tokenize import tokenize as _hy_tok - import sys - - - def _print(*args, **kwargs): - sys.stdout.write(" ".join([str(x) for x in args]) + "\n") - sys.stdout.flush() - - - def _read(*args): - return sys.stdin.readline() - - - def _lex(*args): - ret = [] - for thing in args: - ret.append(_hy_tok(thing)) - return ret - - - def _foreach(*args): - a = args[0] - for arg in a: - args[1](arg) - - def _get(*args): - m = args[0] - k = args[1] - if k in m: - return m[k] - else: - if len(args) > 2: - return args[2] - raise KeyError("No such key `%s` in map." % (k)) - + from hy.lang.natives import natives, _lex def _eval(*args): + """ + This needs to be in here, since we need to assign the + global namespace of evaluated nodes in the same namespace + as the caller. + """ ret = [] for node in _lex(*args): for tree in node: tree.set_namespace(globals()) ret.append(tree()) return ret - - - def _plus(*args): - ret = args[0] - args = args[1:] - for x in args: - ret += x - return ret - - - def _subtract(*args): - ret = args[0] - args = args[1:] - for x in args: - ret -= x - return ret - - - def _mult(*args): - ret = args[0] - args = args[1:] - for x in args: - ret *= x - return ret - - - def _divide(*args): - ret = args[0] - args = args[1:] - for x in args: - ret /= x - return ret - - - def _eq(*args): - car, cdr = args[0], args[1:] - for arg in cdr: - if arg != car: - return False - return True - - - def _ne(*args): - seen = set() - for arg in args: - if arg in seen: - return False - seen.add(arg) - return True - - - def _gt(*args): - arg = args[0] - for i in range(1, len(args)): - if not (args[i - 1] > args[i]): - return False - return True - - - def _ge(*args): - arg = args[0] - for i in range(1, len(args)): - if not (args[i - 1] >= args[i]): - return False - return True - - - def _le(*args): - arg = args[0] - for i in range(1, len(args)): - if not (args[i - 1] <= args[i]): - return False - return True - - - def _lt(*args): - arg = args[0] - for i in range(1, len(args)): - if not (args[i - 1] < args[i]): - return False - return True - - - natives = { - "print": _print, - "puts": _print, - "+": _plus, - "-": _subtract, - "*": _mult, - "/": _divide, - "==": _eq, - ">": _gt, - ">=": _ge, - "<": _lt, - "<=": _le, - "!=": _ne, - "eval": _eval, - "lex": _lex, - "read": _read, - "foreach": _foreach, - "get": _get - } + globals()['eval'] = _eval for native in natives: globals()[native] = natives[native] + del(natives) + eval(shim.__code__, mod.__dict__) diff --git a/hy/lang/builtins.py b/hy/lang/builtins.py index fd76fdf..6aa3cf1 100644 --- a/hy/lang/builtins.py +++ b/hy/lang/builtins.py @@ -25,13 +25,12 @@ def _fn(obj, lns): def _(*args, **kwargs): l = lns.clone() - m = meth.copy() for i in range(0, len(sig)): name = sig[i] value = args[i] l[name] = value - ret = m.eval(l, *args, **kwargs) + ret = meth.eval(l, *args, **kwargs) return ret return _ @@ -80,5 +79,5 @@ builtins = { "kwapply": _kwapply, "if": _if, "loop": _loop, - "progn": _progn + "progn": _progn, } diff --git a/hy/lang/hyobj.py b/hy/lang/hyobj.py index 0ed1327..5028763 100644 --- a/hy/lang/hyobj.py +++ b/hy/lang/hyobj.py @@ -1,5 +1,6 @@ from hy.lang.internals import HYNamespaceCOW + class HYObject(object): def set_namespace(self, ns): self.namespace = ns @@ -20,6 +21,10 @@ class HYObject(object): if fn in self.namespace: return self.namespace[fn] + if fn in self.namespace['__builtins__']: + return self.namespace['__builtins__'][fn] + # builtin lookup + if "." in fn: lon, short = fn.rsplit(".", 1) holder = self.lookup(lns, lon) @@ -32,6 +37,12 @@ class HYObject(object): node.eval(lns, *args, **kwargs) return self + def _issue_job(self, job, *args, **kwargs): + pass + + def _join(self): + pass + def copy(self): new = type(self)(self) new.set_namespace(self.namespace) diff --git a/hy/lang/natives.py b/hy/lang/natives.py new file mode 100644 index 0000000..67fb9bb --- /dev/null +++ b/hy/lang/natives.py @@ -0,0 +1,141 @@ +from hy.lang.bool import HYBool +from hy.lex.tokenize import tokenize as _hy_tok +import sys + + +def _print(*args, **kwargs): + sys.stdout.write(" ".join([str(x) for x in args]) + "\n") + sys.stdout.flush() + + +def _read(*args): + return sys.stdin.readline() + + +def _lex(*args): + ret = [] + for thing in args: + ret.append(_hy_tok(thing)) + return ret + + +def _foreach(*args): + a = args[0] + for arg in a: + args[1](arg) + +def _get(*args): + m = args[0] + k = args[1] + if k in m: + return m[k] + else: + if len(args) > 2: + return args[2] + raise KeyError("No such key `%s` in map." % (k)) + + +def _plus(*args): + ret = args[0] + args = args[1:] + for x in args: + ret += x + return ret + + +def _subtract(*args): + ret = args[0] + args = args[1:] + for x in args: + ret -= x + return ret + + +def _mult(*args): + ret = args[0] + args = args[1:] + for x in args: + ret *= x + return ret + + +def _divide(*args): + ret = args[0] + args = args[1:] + for x in args: + ret /= x + return ret + + +def _eq(*args): + car, cdr = args[0], args[1:] + for arg in cdr: + if arg != car: + return False + return True + + +def _ne(*args): + seen = set() + for arg in args: + if arg in seen: + return False + seen.add(arg) + return True + + +def _gt(*args): + arg = args[0] + for i in range(1, len(args)): + if not (args[i - 1] > args[i]): + return False + return True + + +def _ge(*args): + arg = args[0] + for i in range(1, len(args)): + if not (args[i - 1] >= args[i]): + return False + return True + + +def _le(*args): + arg = args[0] + for i in range(1, len(args)): + if not (args[i - 1] <= args[i]): + return False + return True + + +def _lt(*args): + arg = args[0] + for i in range(1, len(args)): + if not (args[i - 1] < args[i]): + return False + return True + + +def _throw(*args): + raise args[0] + + +natives = { + "print": _print, + "puts": _print, + "+": _plus, + "-": _subtract, + "*": _mult, + "/": _divide, + "==": _eq, + ">": _gt, + ">=": _ge, + "<": _lt, + "<=": _le, + "!=": _ne, + "lex": _lex, + "read": _read, + "foreach": _foreach, + "get": _get, + "throw": _throw +} diff --git a/requirements.txt b/requirements.txt index 4283f38..62497ed 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ flake8 nose +coverage