xo-expression2/xo-interpreter/include/xo/interpreter/GlobalEnv.hpp

73 lines
2.6 KiB
C++

/** @file GlobalEnv.hpp **/
#pragma once
#include "Env.hpp"
#include "xo/alloc/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<std::string, gp<Object>>;
public:
/** Create top-level global environment, allocating via @p mm.
* Expect one of these per interpreter session.
**/
static gp<GlobalEnv> make_empty(gc::IAlloc * mm,
const rp<GlobalSymtab> & symtab);
#ifdef NOT_USING
gc::IAlloc * get_mm() const { return mm_; }
#endif
const rp<GlobalSymtab> & symtab() const { return symtab_; }
// inherited from Env..
virtual bool local_contains_var(const std::string & vname) const final override;
virtual gp<Object> * lookup_slot(const std::string & vname) final override;
virtual gp<Object> * establish_var(bp<Variable> 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<GlobalSymtab> & 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<GlobalSymtab> 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<map_type> slot_map_;
};
} /*namespace scm*/
} /*namespace xo*/
/* end GlobalEnv.hpp */