1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- """Implementation and activation of a basic macro-powered REPL."""
- import code
- import ast
- import sys
- from macropy.core.macros import expand_entire_ast, detect_macros
- class MacroConsole(code.InteractiveConsole):
- def __init__(self, locals=None, filename="<console>"):
- code.InteractiveConsole.__init__(self, locals, filename)
- self.bindings = []
- def runsource(self, source, filename="<input>", symbol="single"):
- try:
- code = self.compile(source, filename, symbol)
- except (OverflowError, SyntaxError, ValueError):
- code = ""
- pass
- if code is None:
- # This means it's incomplete
- return True
- try:
- tree = ast.parse(source)
- bindings = detect_macros(tree)
- for p, names in bindings:
- __import__(p)
- self.bindings.extend([(sys.modules[p], bindings) for (p, bindings) in bindings])
- tree = expand_entire_ast(tree, source, self.bindings)
- tree = ast.Interactive(tree.body)
- code = compile(tree, filename, symbol, self.compile.compiler.flags, 1)
- except (OverflowError, SyntaxError, ValueError):
- # Case 1
- self.showsyntaxerror(filename)
- # This means there's a syntax error
- return False
- self.runcode(code)
- # This means it was successfully compiled; `runcode` takes care of
- # any runtime failures
- return False
|