OSDN Git Service

Trace command.
authorSimon Forman <sforman@hushmail.com>
Tue, 28 Apr 2020 22:28:43 +0000 (15:28 -0700)
committerSimon Forman <sforman@hushmail.com>
Tue, 28 Apr 2020 22:28:43 +0000 (15:28 -0700)
Don't print trace by default, instead a new `trace` combinator wirks like `i` and prints a trace.

joy/__main__.py
joy/joy.py
joy/utils/pretty_print.py

index c461ef8..29017c5 100644 (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
index 684a305..6a47a1b 100644 (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()
index 1d636be..217e294 100644 (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):