/** @file GlobalEnv.hpp **/ #pragma once #include "Env.hpp" #include "xo/allocutil/IAlloc.hpp" #include "xo/expression/GlobalSymtab.hpp" namespace xo { namespace scm { /** @class GlobalEnv * @brief Top-level global environment **/ class GlobalEnv : public Env { public: using map_type = std::map>; public: /** Create top-level global environment, allocating via @p mm. * Expect one of these per interpreter session. **/ static gp make_empty(gc::IAlloc * mm, const rp & symtab); #ifdef NOT_USING gc::IAlloc * get_mm() const { return mm_; } #endif const rp & symtab() const { return symtab_; } // inherited from Env.. virtual bool local_contains_var(const std::string & vname) const final override; virtual gp * lookup_slot(const std::string & vname) final override; virtual gp * establish_var(bp var) final override; // inherited from Object.. virtual TaggedPtr self_tp() const final override; virtual void display(std::ostream & os) const final override; virtual std::size_t _shallow_size() const final override; virtual Object * _shallow_copy(gc::IAlloc * mm) const final override; virtual std::size_t _forward_children(gc::IAlloc * mm) final override; private: GlobalEnv(const GlobalEnv & x); GlobalEnv(gc::IAlloc * mm, const rp & symtab); private: /** memory manager to use **/ gc::IAlloc * mm_ = nullptr; /** global symbol table. * variables known to @c symtab_ are represented by * corresponding values in @p slot_map_ **/ rp symtab_; /** environment contents. * expression @c symtab_->lookup_binding(vname) * has associated value @c slot_map_.at(vname) * * TODO: replace with something subject to GC ? * every member of @ref slot_map_ will have to be a * GC root * * TODO: probably want to hash here instead. * May also want lhs names to be separately hashed symbols **/ up slot_map_; }; } /*namespace scm*/ } /*namespace xo*/ /* end GlobalEnv.hpp */