From aa71b4da36a8947a59dd67cc1be9d0f49de1a121 Mon Sep 17 00:00:00 2001 From: Pekka Laiho Date: Sat, 6 Jun 2020 21:02:02 +0700 Subject: [PATCH] debugging support for eval --- bootstrap.php | 2 +- src/Evaller.php | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/bootstrap.php b/bootstrap.php index bb92f1f..33cb8d4 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -5,8 +5,8 @@ function ml_get_lisp(): array { $tokenizer = new MadLisp\Tokenizer(); $reader = new MadLisp\Reader(); - $eval = new MadLisp\Evaller($tokenizer, $reader); $printer = new MadLisp\Printer(); + $eval = new MadLisp\Evaller($tokenizer, $reader, $printer); $lisp = new MadLisp\Lisp($tokenizer, $reader, $eval, $printer); diff --git a/src/Evaller.php b/src/Evaller.php index aaf3f6f..8bd130f 100644 --- a/src/Evaller.php +++ b/src/Evaller.php @@ -5,17 +5,36 @@ class Evaller { protected Tokenizer $tokenizer; protected Reader $reader; + protected Printer $printer; - public function __construct(Tokenizer $tokenizer, Reader $reader) + private const DEBUG = true; + + public function __construct(Tokenizer $tokenizer, Reader $reader, Printer $printer) { $this->tokenizer = $tokenizer; $this->reader = $reader; + $this->printer = $printer; } public function eval($ast, Env $env) { + if (self::DEBUG) { + print("eval: "); + $this->printer->print($ast); + print("\n"); + $loops = 0; + } + while (true) { + if (self::DEBUG) { + if ($loops++ > 0) { + print("eval loop: "); + $this->printer->print($ast); + print("\n"); + } + } + // Not list or empty list if (!($ast instanceof MList)) { return $this->evalAst($ast, $env);