From 9cbe6b4399b1dd767429efcc15376761a36048d5 Mon Sep 17 00:00:00 2001 From: Tim Vieira Date: Fri, 28 Jun 2013 15:05:26 -0400 Subject: [PATCH] Reorganize imports so that loader/post-processor deps only matter when you ask for them (e.g. matplotlib) and that ./dyna starts-up quicker. --- .gitignore | 2 ++ src/Dyna/Backend/Python/__init__.py | 0 src/Dyna/Backend/Python/defn.py | 6 +---- src/Dyna/Backend/Python/interpreter.py | 2 +- src/Dyna/Backend/Python/load/__init__.py | 18 +++++++------ src/Dyna/Backend/Python/post/__init__.py | 17 ++++++------- src/Dyna/Backend/Python/post/trace.py | 4 +-- src/Dyna/Backend/Python/repl.py | 32 ++++++++++-------------- src/Dyna/Backend/Python/utils.py | 16 +++++++++++- test/repl/load.dyna | 4 +-- 10 files changed, 52 insertions(+), 49 deletions(-) create mode 100644 src/Dyna/Backend/Python/__init__.py diff --git a/.gitignore b/.gitignore index ec9fd47..49f4a3e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ *.swp *.pyc +*.d # debugger's output directory. + dist/ examples/*.d examples/*.hist diff --git a/src/Dyna/Backend/Python/__init__.py b/src/Dyna/Backend/Python/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/Dyna/Backend/Python/defn.py b/src/Dyna/Backend/Python/defn.py index 1859ee3..a45b35e 100644 --- a/src/Dyna/Backend/Python/defn.py +++ b/src/Dyna/Backend/Python/defn.py @@ -5,7 +5,7 @@ from __future__ import division import operator from collections import Counter - +from utils import drepr, _repr class Aggregator(object): def fold(self): @@ -61,10 +61,6 @@ def user_vars(variables): if name.startswith('u') and not name.startswith('u_')) -from term import _repr -def drepr(vs): - return '{%s}' % ', '.join('%s=%s' % (k, _repr(v)) for k,v in vs.iteritems()) - from collections import namedtuple class Result(namedtuple('Result', 'value variables')): def __repr__(self): diff --git a/src/Dyna/Backend/Python/interpreter.py b/src/Dyna/Backend/Python/interpreter.py index 2bf13b9..f55ddbb 100644 --- a/src/Dyna/Backend/Python/interpreter.py +++ b/src/Dyna/Backend/Python/interpreter.py @@ -552,7 +552,7 @@ class Interpreter(object): for k, v in env.agg_decl.items(): self.new_fn(k, v) - new_rules = set() + new_rules = set() for _, r, _ in env.queries: new_rules.add(r) for r, _ in env.initializers: diff --git a/src/Dyna/Backend/Python/load/__init__.py b/src/Dyna/Backend/Python/load/__init__.py index 79da4ba..462a3b4 100644 --- a/src/Dyna/Backend/Python/load/__init__.py +++ b/src/Dyna/Backend/Python/load/__init__.py @@ -1,9 +1,12 @@ -from sexpr import sexpr -from tsv import tsv -from matrix import matrix -from pickled import pickled +#from sexpr import sexpr +#from tsv import tsv +#from matrix import matrix +#from pickled import pickled import re as _re +from utils import get_module + +available = 'sexpr', 'tsv', 'matrix' def run(interp, line): try: @@ -14,11 +17,10 @@ def run(interp, line): print return - try: - m = getattr(__import__('load'), module)(interp, name) - except KeyError: - print 'did not recognize post-processor %r' % name + if module not in available: + print 'did not recognize loader %r' % name return + m = get_module('load', module)(interp, name) exec 'm.main(%s)' % args interp.go() diff --git a/src/Dyna/Backend/Python/post/__init__.py b/src/Dyna/Backend/Python/post/__init__.py index 1484307..f4f3e7b 100644 --- a/src/Dyna/Backend/Python/post/__init__.py +++ b/src/Dyna/Backend/Python/post/__init__.py @@ -1,24 +1,21 @@ import re as _re -from save import save -from graph import graph -from draw_circuit import draw_circuit -from dump_solution import dump_solution -from trace import trace +from utils import get_module + +available = 'trace', 'dump_solution', 'draw_circuit', 'graph', 'save' def run(interp, line): try: - [(name, args)] = _re.findall('([a-z][a-zA-Z_0-9]*)\((.*)\)$', line.strip()) + [(module, args)] = _re.findall('([a-z][a-zA-Z_0-9]*)\((.*)\)$', line.strip()) except ValueError: print 'Error: failed to parse post command.' print ' %s' % line print return - try: - m = globals()[name](interp) - except KeyError: - print 'did not recognize post-processor %r' % name + if module not in available: + print 'did not recognize post-processor %r' % module return + m = get_module('post', module)(interp) eval('m.main(%s)' % args) diff --git a/src/Dyna/Backend/Python/post/trace.py b/src/Dyna/Backend/Python/post/trace.py index 10b3cd1..fe7a590 100644 --- a/src/Dyna/Backend/Python/post/trace.py +++ b/src/Dyna/Backend/Python/post/trace.py @@ -6,9 +6,7 @@ TODO: backchained stuff """ import re -from utils import yellow, green, red -from defn import drepr -from term import _repr +from utils import yellow, green, red, _repr, drepr import debug, defn from cStringIO import StringIO from utils import lexer, subst diff --git a/src/Dyna/Backend/Python/repl.py b/src/Dyna/Backend/Python/repl.py index afe0290..1ebc77b 100644 --- a/src/Dyna/Backend/Python/repl.py +++ b/src/Dyna/Backend/Python/repl.py @@ -16,21 +16,13 @@ to help. TODO: $include load rules from a file. """ -import re, os, cmd, readline - -import debug, interpreter -from utils import dynac, ip, lexer, subst +import os, cmd, readline +from utils import dynac, ip, lexer, subst, drepr, _repr from errors import DynaCompilerError, DynaInitializerException -from chart import _repr from config import dotdynadir - from errors import show_traceback -import load, post - from interpreter import Interpreter, foo, none - -from term import _repr -from defn import drepr +import load, post class REPL(cmd.Cmd, object): @@ -134,6 +126,7 @@ class REPL(cmd.Cmd, object): """ Development tool. Used for view Dyna's intermediate representations. """ + import debug with file(dotdynadir / 'repl-debug-line.dyna', 'wb') as f: f.write(line) debug.main(f.name) @@ -211,8 +204,8 @@ class REPL(cmd.Cmd, object): - `query` shows variable bindings applied to query :- query f(X) - 1 ← f(1) - 4 ← f(2) + 1 =* f(1) + 4 =* f(2) """ results = self._query(q) @@ -327,8 +320,9 @@ class REPL(cmd.Cmd, object): [cmd, sub] = mod if cmd in ('load', 'post'): try: - print getattr(globals()[cmd], sub).__doc__ - except (KeyError, AttributeError): + exec 'from %s.%s import %s as m' % (cmd, sub, sub) + print m.__doc__ + except (ImportError, KeyError, AttributeError): print 'No help available for "%s %s"' % (cmd, sub) return else: @@ -341,7 +335,7 @@ class REPL(cmd.Cmd, object): Available loaders: - {loaders} + {load} For more information about a particular loader type the following (in this case we get help for the `tsv` loader): @@ -370,8 +364,6 @@ class REPL(cmd.Cmd, object): show_traceback() readline.write_history_file(self.hist) - do_load.__doc__ = do_load.__doc__.format(loaders=', '.join(x for x in dir(load) if not x.startswith('_'))) - def do_post(self, line): """ Execute post-processor. @@ -392,4 +384,6 @@ class REPL(cmd.Cmd, object): show_traceback() readline.write_history_file(self.hist) - do_post.__doc__ = do_post.__doc__.format(post=', '.join(x for x in dir(post) if not x.startswith('_'))) + + do_load.__doc__ = do_load.__doc__.format(load=', '.join(load.available)) + do_post.__doc__ = do_post.__doc__.format(post=', '.join(post.available)) diff --git a/src/Dyna/Backend/Python/utils.py b/src/Dyna/Backend/Python/utils.py index 92162e4..548e2c5 100644 --- a/src/Dyna/Backend/Python/utils.py +++ b/src/Dyna/Backend/Python/utils.py @@ -7,6 +7,7 @@ import signal from contextlib import contextmanager from collections import namedtuple + def _repr(x): if x is True: return 'true' @@ -21,10 +22,23 @@ def _repr(x): return repr(x) +def drepr(vs): + return '{%s}' % ', '.join('%s=%s' % (k, _repr(v)) for k,v in vs.iteritems()) + + # interactive IPython shell ip = InteractiveShellEmbed(banner1 = 'Dropping into IPython\n') +def get_module(cmd, sub): + try: + exec 'from %s.%s import %s as m' % (cmd, sub, sub) + except (ImportError, SyntaxError): + return + else: + return m + + black, red, green, yellow, blue, magenta, cyan, white = \ map('\033[3%sm%%s\033[0m'.__mod__, range(8)) @@ -149,9 +163,9 @@ def parse_sexpr(e): class ANF(namedtuple('ANF', 'lines ruleix agg head evals unifs result')): pass + def read_anf(e): def _g(x): -# return [(var, val[0], val[1:]) for var, val in x] for var, val in x: if isinstance(val, list): yield (var, val[0], val[1:]) diff --git a/test/repl/load.dyna b/test/repl/load.dyna index 240278a..42bd9e6 100644 --- a/test/repl/load.dyna +++ b/test/repl/load.dyna @@ -3,13 +3,13 @@ % binary rules rewrite(X, Y, Z) := rules_tsv(Linenum, Cost, X, R), - cons(Y, &cons(Z, &nil)) is pycall("split", R, "\\s+"), + [Y, Z] is pycall("split", R, "\\s+"), pycall("float", Cost). % load unary rules rewrite(X, Y) := rules_tsv(Linenum, Cost, X, R), - cons(Y, &nil) is pycall("split", R, "\\s+"), + [Y] is pycall("split", R, "\\s+"), pycall("float", Cost). phrase(S,X,I,K) += phrase(S,Y,I,K) + rewrite(X,Y). -- 2.50.1