Trace command.

Don't print trace by default, instead a new `trace` combinator wirks like `i` and prints a trace.
This commit is contained in:
Simon Forman 2020-04-28 15:28:43 -07:00
parent 4704799c37
commit ddf063973c
3 changed files with 32 additions and 7 deletions

View File

@ -20,6 +20,8 @@
from __future__ import print_function
from .library import initialize
from .joy import repl
from .utils import pretty_print # Inscribe trace command.
print('''\
Thun - Copyright © 2017 Simon Forman

View File

@ -28,7 +28,6 @@ from builtins import input
from traceback import print_exc, format_exc
from .parser import text_to_expression, ParseError, Symbol
from .utils.stack import stack_to_string
from .utils.pretty_print import TracePrinter
def joy(stack, expression, dictionary, viewer=None):
@ -101,16 +100,11 @@ def repl(stack=(), dictionary=None):
text = input('joy? ')
except (EOFError, KeyboardInterrupt):
break
viewer = TracePrinter()
try:
stack, _, dictionary = run(text, stack, dictionary, viewer.viewer)
stack, _, dictionary = run(text, stack, dictionary)
except:
exc = format_exc() # Capture the exception.
viewer.print_() # Print the Joy trace.
print('-' * 73)
print(exc) # Print the original exception.
else:
viewer.print_()
except:
print_exc()
print()

View File

@ -43,6 +43,35 @@ from __future__ import print_function
from builtins import object
from traceback import print_exc
from .stack import expression_to_string, stack_to_string
from ..joy import joy
from ..library import inscribe, FunctionWrapper
@inscribe
@FunctionWrapper
def trace(stack, expression, dictionary):
'''Evaluate a Joy expression on a stack and print a trace.
This function is just like the `i` combinator but it also prints a
trace of the evaluation
:param stack stack: The stack.
:param stack expression: The expression to evaluate.
:param dict dictionary: A ``dict`` mapping names to Joy functions.
:rtype: (stack, (), dictionary)
'''
tp = TracePrinter()
quote, stack = stack
try:
s, _, d = joy(stack, quote, dictionary, tp.viewer)
except:
tp.print_()
print('-' * 73)
raise
else:
tp.print_()
return s, expression, d
class TracePrinter(object):