From 24eab1034ec8c017dbd986297851423f7bc8855e Mon Sep 17 00:00:00 2001 From: Riyyi Date: Sun, 23 Apr 2023 11:31:59 +0200 Subject: [PATCH] Eval: Speed up isMacroCall a bit --- src/ast.h | 1 + src/eval.cpp | 14 +++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/ast.h b/src/ast.h index 720cc42..5357287 100644 --- a/src/ast.h +++ b/src/ast.h @@ -65,6 +65,7 @@ public: size_t size() const { return m_nodes.size(); } bool empty() const { return m_nodes.size() == 0; } + ValuePtr front() const { return m_nodes.front(); } const std::list& nodes() const { return m_nodes; } protected: diff --git a/src/eval.cpp b/src/eval.cpp index 82408fc..25d5d5c 100644 --- a/src/eval.cpp +++ b/src/eval.cpp @@ -202,19 +202,23 @@ ValuePtr Eval::evalAst(ValuePtr ast, EnvironmentPtr env) // (x y z) bool Eval::isMacroCall(ValuePtr ast, EnvironmentPtr env) { - if (!is(ast.get())) { + auto list = dynamic_cast(ast.get()); + + if (list == nullptr || list->empty()) { return false; } - auto nodes = std::static_pointer_cast(ast)->nodes(); + auto front = list->front().get(); - if (nodes.size() == 0 || !is(nodes.front().get())) { + if (!is(front)) { return false; } - auto value = env->get(std::static_pointer_cast(nodes.front())->symbol()); + auto symbol = dynamic_cast(front)->symbol(); + auto value = env->get(symbol).get(); + auto lambda = dynamic_cast(value); - if (!is(value.get()) || !std::static_pointer_cast(value)->isMacro()) { + if (lambda == nullptr || !lambda->isMacro()) { return false; }