From ddf063973c1c38ce22c662147a18438bc9c0876e Mon Sep 17 00:00:00 2001 From: Simon Forman Date: Tue, 28 Apr 2020 15:28:43 -0700 Subject: [PATCH] Trace command. Don't print trace by default, instead a new `trace` combinator wirks like `i` and prints a trace. --- joy/__main__.py | 2 ++ joy/joy.py | 8 +------- joy/utils/pretty_print.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/joy/__main__.py b/joy/__main__.py index c461ef8..29017c5 100644 --- a/joy/__main__.py +++ b/joy/__main__.py @@ -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 diff --git a/joy/joy.py b/joy/joy.py index 684a305..6a47a1b 100644 --- a/joy/joy.py +++ b/joy/joy.py @@ -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() diff --git a/joy/utils/pretty_print.py b/joy/utils/pretty_print.py index 1d636be..217e294 100644 --- a/joy/utils/pretty_print.py +++ b/joy/utils/pretty_print.py @@ -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):