Eval: Speed up isMacroCall a bit

This commit is contained in:
Riyyi
2023-04-23 11:31:59 +02:00
parent 6e0fe3a2f5
commit 24eab1034e
2 changed files with 10 additions and 5 deletions
+1
View File
@@ -65,6 +65,7 @@ public:
size_t size() const { return m_nodes.size(); } size_t size() const { return m_nodes.size(); }
bool empty() const { return m_nodes.size() == 0; } bool empty() const { return m_nodes.size() == 0; }
ValuePtr front() const { return m_nodes.front(); }
const std::list<ValuePtr>& nodes() const { return m_nodes; } const std::list<ValuePtr>& nodes() const { return m_nodes; }
protected: protected:
+9 -5
View File
@@ -202,19 +202,23 @@ ValuePtr Eval::evalAst(ValuePtr ast, EnvironmentPtr env)
// (x y z) // (x y z)
bool Eval::isMacroCall(ValuePtr ast, EnvironmentPtr env) bool Eval::isMacroCall(ValuePtr ast, EnvironmentPtr env)
{ {
if (!is<List>(ast.get())) { auto list = dynamic_cast<List*>(ast.get());
if (list == nullptr || list->empty()) {
return false; return false;
} }
auto nodes = std::static_pointer_cast<List>(ast)->nodes(); auto front = list->front().get();
if (nodes.size() == 0 || !is<Symbol>(nodes.front().get())) { if (!is<Symbol>(front)) {
return false; return false;
} }
auto value = env->get(std::static_pointer_cast<Symbol>(nodes.front())->symbol()); auto symbol = dynamic_cast<Symbol*>(front)->symbol();
auto value = env->get(symbol).get();
auto lambda = dynamic_cast<Lambda*>(value);
if (!is<Lambda>(value.get()) || !std::static_pointer_cast<Lambda>(value)->isMacro()) { if (lambda == nullptr || !lambda->isMacro()) {
return false; return false;
} }