xo-umbrella2/xo-expression/include/xo/expression/GlobalSymtab.hpp
Roland Conybeare 043b2d7efc git subrepo clone (merge) git@github.com:Rconybea/xo-expression.git xo-expression
subrepo:
  subdir:   "xo-expression"
  merged:   "fbc5b619"
upstream:
  origin:   "git@github.com:Rconybea/xo-expression.git"
  branch:   "main"
  commit:   "fbc5b619"
git-subrepo:
  version:  "0.4.9"
  origin:   "???"
  commit:   "???"
2026-06-06 22:09:38 -04:00

66 lines
1.9 KiB
C++

/* file GlobalSymtab.hpp
*
* author: Roland Conybeare, Jun 2024
*/
#pragma once
#include "SymbolTable.hpp"
#include <map>
#include <string>
namespace xo {
namespace scm {
class GlobalSymtab : public SymbolTable {
public:
/** create instance. Probably only need one of these **/
static rp<GlobalSymtab> make_empty() { return new GlobalSymtab(); }
bp<Expression> require_global(const std::string & vname,
bp<Expression> expr);
// ----- Environment -----
virtual bool is_global_env() const override { return true; }
virtual binding_path lookup_binding(const std::string & /*vname*/) const override {
/* i_link: -1 for global environment
* j_slot: not used
*/
return { -1, 0 };
}
virtual bp<Expression> lookup_var(const std::string & vname) const override {
return this->lookup_local(vname);
}
virtual bp<Expression> lookup_local(const std::string & vname) const override {
auto ix = global_map_.find(vname);
if (ix == global_map_.end()) {
/* not found */
return bp<Variable>();
}
return ix->second;
}
virtual void upsert_local(bp<Variable> target) override;
virtual void print(std::ostream & os) const override;
virtual std::uint32_t pretty_print(const xo::print::ppindentinfo & ppii) const override;
private:
GlobalSymtab();
private:
/* for assignable globals, need to allocate memory
* addresses for these.
*/
std::map<std::string, rp<Expression>> global_map_;
};
} /*namespace scm*/
} /*namespace xo*/
/* end GlobalSymtab.hpp */