/* * Copyright (C) 2023 Riyyi * * SPDX-License-Identifier: MIT */ #pragma once #include #include "environment.h" #include "forward.h" namespace blaze { class List; class Eval { public: Eval(ASTNodePtr ast, EnvironmentPtr env); virtual ~Eval() = default; void eval(); ASTNodePtr ast() const { return m_ast; } private: ASTNodePtr evalImpl(ASTNodePtr ast, EnvironmentPtr env); ASTNodePtr evalAst(ASTNodePtr ast, EnvironmentPtr env); ASTNodePtr evalDef(const std::list& nodes, EnvironmentPtr env); ASTNodePtr evalFn(const std::list& nodes, EnvironmentPtr env); ASTNodePtr apply(std::shared_ptr evaluated_list); ASTNodePtr m_ast; EnvironmentPtr m_env; }; } // namespace blaze