Fixed a bug

master
Mark 2022-10-28 17:40:48 -07:00
parent 8871f1430d
commit e41de764e8
Signed by: Mark
GPG Key ID: AD62BB059C2AAEE4
2 changed files with 13 additions and 13 deletions

View File

@ -372,7 +372,7 @@ class Call(Node):
def print_node(node: Node) -> str: def print_node(node: Node) -> str:
if not isinstance(node, Node): if not isinstance(node, Node):
raise TypeError(f"I don't know how to print a {type(node)}") raise TypeError(f"I don't know how to print a {type(node)}")
else:
out = "" out = ""
for s, n in node: for s, n in node:
@ -489,16 +489,13 @@ def bind_variables(node: Node, *, ban_macro_name = None) -> None:
# Returns the function's output. # Returns the function's output.
def call_func(fn: Func, arg: Node): def call_func(fn: Func, arg: Node):
for s, n in fn: for s, n in fn:
if isinstance(n, Bound): if isinstance(n, Bound) and (s == Direction.UP):
if n == fn.input: if n == fn.input:
if n.parent is None: if n.parent is None:
raise Exception("Tried to substitute a None bound variable.") raise Exception("Tried to substitute a None bound variable.")
if n.parent_side == Direction.LEFT: n.parent.set_side(n.parent_side, clone(arg)) # type: ignore
n.parent.left = clone(arg) return clone(fn.left)
else:
n.parent.right = clone(arg)
return fn.left
# Do a single reduction step # Do a single reduction step
@ -514,7 +511,10 @@ def reduce(node: Node, *, macro_table = {}) -> tuple[ReductionType, Node]:
out = call_func(n.left, n.right) out = call_func(n.left, n.right)
out._set_parent(None, None) out._set_parent(None, None)
else: else:
n.parent.left = call_func(n.left, n.right) n.parent.set_side(
n.parent_side, # type: ignore
call_func(n.left, n.right)
)
return ReductionType.FUNCTION_APPLY, out return ReductionType.FUNCTION_APPLY, out

View File

@ -11,7 +11,6 @@ class StopReason(enum.Enum):
LOOP_DETECTED = ("class:warn", "Loop detected") LOOP_DETECTED = ("class:warn", "Loop detected")
MAX_EXCEEDED = ("class:err", "Too many reductions") MAX_EXCEEDED = ("class:err", "Too many reductions")
INTERRUPT = ("class:warn", "User interrupt") INTERRUPT = ("class:warn", "User interrupt")
RECURSION = ("class:err", "Python Recursion Error")
class MacroDef: class MacroDef:
@staticmethod @staticmethod
@ -107,9 +106,10 @@ class Runner:
node, node,
macro_table = self.macro_table macro_table = self.macro_table
) )
except RecursionError: except KeyboardInterrupt:
stop_reason = StopReason.RECURSION stop_reason = StopReason.INTERRUPT
break break
node = new_node node = new_node
# If we can't reduce this expression anymore, # If we can't reduce this expression anymore,