2#ifndef INCLUDED_NEWLANG_CONTEXT_
3#define INCLUDED_NEWLANG_CONTEXT_
49 std::map<std::string, VariablePair>
vars;
52 class LatterType :
public std::variant<VariablePair, VariablePair *> {
70 if (std::holds_alternative<VariablePair>(*
this)) {
71 return std::get<VariablePair>(*
this);
72 }
else if (std::get<VariablePair *>(*
this)) {
73 return *std::get<VariablePair *>(*
this);
81 inline operator bool() {
82 return std::holds_alternative<VariablePair>(*
this) || std::get<VariablePair *>(*
this);
93 static_cast<std::variant<VariablePair, VariablePair *>
>(*this) =
static_cast<VariablePair>(var);
111 class Context :
public std::vector<VariableScope>,
public std::enable_shared_from_this<Context> {
138 LOG_RUNTIME(
"'%s' is not an internal name!", term->m_text.c_str());
168 std::string
Dump(
size_t num = 0);
176 if (ns.rfind(
"::") != ns.size() - 2) {
190 auto iter = rbegin();
191 while (iter != rend()) {
192 if (iter->ns.compare(name.begin()) == 0) {
193 return iter == rbegin();
197 LOG_RUNTIME(
"Named block '%s' not found!", name.begin());
204 auto iter = rbegin();
209 while (iter != rend()) {
210 if (
result.find(
"::") == 0) {
213 if (skip < 0 && count == -skip) {
216 if (!iter->ns.empty() && (!is_global || !isdigit(iter->ns[0]))) {
218 result.insert(0, iter->ns);
227 return runner ? runner->
m_runtime :
nullptr;
void EvalLeftVars_(VariablePairList &vars, const TermPtrConst &op)
static ObjPtr EvalOpMath_(TermPtr &op, Context *runner)
static ObjPtr SetFieldValue(TermPtr &term, ObjPtr value, Context *runner)
static ObjPtr EvalOpCompare_(TermPtr &op, Context *runner)
static std::unique_ptr< Sync > CreateSync(const TermPtr &term)
static LatterType Execute(Module &module, TermPtr ast, Context *runner)
ObjPtr EvalEval_(TermPtr &op)
bool CheckTargetScope(const std::string_view &name)
static LatterType EvalTerm(TermPtr term, Context *runner, bool rvalue=true)
std::string MakeNamespace(int skip, bool is_global)
LatterType EvalDoWhile_(TermPtr &op)
ObjPtr EvalInterrupt_(TermPtr &term)
static ObjPtr CallNative_(Context *runner, Obj &obj, Obj *args=nullptr)
static ObjPtr EvalFollow_(TermPtr &op, Context *runner)
static std::string StringPrintf(std::string_view format, Obj &args)
LatterType EvalTryBlock_(TermPtr &block)
static ObjPtr EvalRange_(TermPtr &op, Context *runner)
static ObjPtr CreateArgs_(TermPtr &term, Context *runner)
LatterType EvalWhile_(TermPtr &op)
VariablePair * FindObject(const std::string_view int_name)
static ObjPtr CreateRange(TermPtr &term, Context *runner)
static bool HasReThrow(TermPtr &block, Context &stack, Obj &obj)
static ObjPtr CreateTensor(TermPtr &term, Context *runner)
void PushScope(const TermID id, const std::string_view &name)
static std::string StringFormat(std::string_view format, Obj &args)
static RunTime * GetRT_(Context *runner)
std::string Dump(size_t num=0)
LatterType EvalCreateAsValue_(TermPtr &op)
ObjPtr EvalTake_(TermPtr &op)
static ObjPtr EvalOpLogical_(TermPtr &op, Context *runner)
VariablePair * FindLocalVar(const TermPtr &term)
ObjPtr EvalOp_(TermPtr &op)
LatterType EvalCreateAsEllipsis_(TermPtr &op)
static ObjPtr Call(Context *runner, Obj &obj, TermPtr &term)
LatterType EvalCreateAsFunc_(TermPtr &op)
static ObjPtr CreateDict(TermPtr &term, Context *runner)
static ObjPtr SetIndexValue(TermPtr &term, ObjPtr value, Context *runner)
ObjPtr EvalIterator_(TermPtr &term)
static ObjPtr GetFieldValue(TermPtr &term, ObjPtr &value, Context *runner)
static ObjPtr EvalOpBitwise_(TermPtr &op, Context *runner)
ObjPtr CreateNative_(TermPtr &proto, const char *module, bool lazzy, const char *mangle_name)
LatterType EvalCreate_(TermPtr &op)
LatterType EvalCreateAsFilling_(TermPtr &op)
static ObjPtr GetIndexValue(TermPtr &term, ObjPtr &value, Context *runner)
CtxPush(Context &ctx, const TermID id, const TermPtr &ns)
LatterType(VariablePair &pair)
VariablePair & GetVariablePair(bool editable=false)
LatterType(VariablePair *pair=nullptr)
static LatterType Create(TermPtr term, D d)
LatterType(const VariablePair pair)
LatterType & operator=(const VariablePair var)
#define LOG_RUNTIME(format,...)
#define ASSERT(condition)
const VariablePair & getNonePair()
std::vector< LatterType > VariablePairList
std::shared_ptr< Term > TermPtr
std::shared_ptr< Obj > ObjPtr
std::shared_ptr< const Term > TermPtrConst
bool isInternalName(const std::string_view name)
std::map< std::string, VariablePair > vars