7#include <torch/torch.h>
39 while (iter != rend()) {
41 result += std::to_string(std::distance(iter, rend()));
47 auto iter_list = iter->vars.begin();
48 while (iter_list != iter->vars.end()) {
55 list += iter_list->first;
72 if (num && count >= num) {
699 return Eval(term, ctx);
708 for (
auto &elem : term->m_block) {
711 }
else if (term->isBlock()) {
713 LOG_RUNTIME(
"Can't calculate '%s' in static mode!", term->toString().c_str());
720 LOG_TEST(
"result: %s",
result.GetVariablePair(
true).var.GetValueAsObject()->toString().c_str());
746 if (obj.
m_value.compare(
"::") == 0) {
751 if (ns.rfind(obj.
m_value) != std::string::npos) {
762 CtxPush scope_block(*
this, block->m_id, block->m_namespace);
779 while (i < block->m_block.size()) {
789 if (interrupt->m_value.empty()) {
840 bool return_value =
false;
849 if (return_value && block->m_left) {
868 for (
size_t i = 0; i < term->m_dims->size(); i++) {
873 for (int64_t i = 0; i < static_cast<int64_t> (term->size()); i++) {
880 ASSERT(!(*term)[i].second->m_left);
881 ASSERT((*term)[i].second->m_right);
887 if (i + 1 != term->size()) {
888 LOG_RUNTIME(
"Filling is supported for the last argument only!");
895 int64_t full_size = 1;
896 for (
int dim_index = 0; dim_index < obj.
m_dimensions->size(); dim_index++) {
898 if (!(*obj.
m_dimensions)[dim_index].second->is_integer()) {
899 LOG_RUNTIME(
"Dimension index support integer value only!");
902 full_size *= (*obj.
m_dimensions)[dim_index].second->GetValueAsInteger();
905 if (full_size <= 0) {
906 LOG_RUNTIME(
"Items count '%ld' error for all dimensions!", full_size);
910 TermPtr fill_obj = (*term)[i].second->m_right;
913 if (fill_obj->size()) {
914 LOG_RUNTIME(
"Argument in function for filling not implemented!");
917 for (int64_t dim_index = args->size(); dim_index < full_size; dim_index++) {
924 }
else if ((*term)[i].second->getTermID() ==
TermID::ELLIPSIS || (*term)[i].second->isNone()) {
926 if (!term->name(i).empty()) {
930 if ((*term)[i].second->m_right) {
932 bool named = ((*term)[i].second->m_left && (*term)[i].second->m_left->getTermID() ==
TermID::ELLIPSIS);
939 if (exp->is_dictionary_type()) {
941 for (
int index = 0; index < exp->size(); index++) {
943 args->push_back((*exp)[index].second, exp->name(index).empty() ?
"" : exp->name(index));
945 args->push_back((*exp)[index].second);
949 }
else if (exp->is_range()) {
952 LOG_RUNTIME(
"Named range expansion not applicable!");
959 ObjPtr start = exp->at(
"start").second->Clone();
960 ObjPtr stop = exp->at(
"stop").second;
964 while (*start < stop) {
965 args->push_back(start->Clone());
969 while (*start > stop) {
970 args->push_back(start->Clone());
978 LOG_RUNTIME(
"Range extension is only supported for integer, rational, or floating point types! (%s)",
toString(type));
982 LOG_RUNTIME(
"Expansion operator applies to dictionary or range only!");
998 if (i + 1 != term->size()) {
999 LOG_RUNTIME(
"Filling is supported for the last argument only!");
1002 int64_t full_size = 1;
1003 for (
int dim_index = 0; dim_index < obj.
m_dimensions->size(); dim_index++) {
1005 if (!(*obj.
m_dimensions)[dim_index].second->is_integer()) {
1006 LOG_RUNTIME(
"Dimension index support integer value only!");
1009 full_size *= (*obj.
m_dimensions)[dim_index].second->GetValueAsInteger();
1012 if (full_size <= 0) {
1013 LOG_RUNTIME(
"Items count '%ld' error for all dimensions!", full_size);
1017 std::vector<ObjPtr> dup;
1019 for (
size_t c = 0; c < args->size(); c++) {
1020 dup.push_back(args->at(c).second);
1028 if ((full_size - args->size()) % dup.size() && runner) {
1030 LOG_RUNTIME(
"The data is filled in with the remainder!");
1032 LOG_WARNING(
"The data is filled in with the remainder!");
1038 int64_t fill_index = 0;
1039 for (int64_t dim_index = args->size(); dim_index < full_size; dim_index++) {
1040 args->push_back(dup[fill_index]->Clone());
1042 if (fill_index >= dup.size()) {
1051 if (term->name(i).empty()) {
1062 return Call(runner, obj, *args.get());
1115 bool is_ellipsis = obj.
m_prototype->is_variable_args();
1123 for (
int i = 0; i < std::max(ags_count, (
int) args.
size() - 1); i++) {
1125 std::string arg_name =
"";
1126 if (i < ags_count) {
1128 if (obj.
m_prototype->at(i).second->m_name_or_class.empty()) {
1129 arg_name += obj.
m_prototype->at(i).second->m_text;
1131 arg_name += obj.
m_prototype->at(i).second->m_name_or_class;
1135 if (!is_ellipsis && ags_count + 1 != args.
size()) {
1140 if (i + 1 < args.
size()) {
1141 arg_value = args[i + 1].second;
1143 if (i < obj.m_prototype->size()) {
1144 arg_value =
Eval(obj.
m_prototype->at(i).second, runner).GetVariablePair(
true).var.GetValueAsObject();
1146 LOG_RUNTIME(
"Неожиданный аргумент по умолчанию!");
1150 ASSERT(!runner->empty());
1151 if (!arg_name.empty()) {
1152 if (runner->back().vars.find(arg_name) != runner->back().vars.end()) {
1153 LOG_RUNTIME(
"Argname '%s' already exist!", arg_name.c_str());
1156 std::string int_name = obj.
m_prototype->at(i).second->m_normalized;
1157 if (int_name.empty()) {
1164 std::string arg_num =
"$";
1165 arg_num += std::to_string(i + 1);
1168 args_dict->push_back(arg_value, arg_name);
1190 ASSERT(std::holds_alternative<void *>(obj.
m_var));
1193 return (*func_ptr)(runner, args);
1208 std::vector<ffi_type *> m_args_type;
1209 std::vector<void *> m_args_ptr;
1220 std::vector<VALUE> m_args_val;
1226 ASSERT(std::holds_alternative<void *>(obj.
m_var));
1227 void * func_ptr = std::get<void *>(obj.
m_var);
1230 LOG_RUNTIME(
"Dymanic load native address '%s'!",
"NOT IMPLEMENTED");
1240 for (
int i = 0; args && i < args->
size(); i++) {
1242 ASSERT((*args)[i].second);
1243 if ((*args)[i].second->m_is_reference) {
1244 LOG_RUNTIME(
"Argument REFERENCE! %s", (*args)[i].second->toString().c_str());
1249 ObjType type = (*args)[i].second->getTypeAsLimit();
1258 temp.boolean = (*args)[i].second->GetValueAsBoolean();
1259 m_args_val.push_back(temp);
1271 temp.integer = (*args)[i].second->GetValueAsInteger();
1272 m_args_val.push_back(temp);
1283 temp.integer = (*args)[i].second->GetValueAsInteger();
1284 m_args_val.push_back(temp);
1295 temp.integer = (*args)[i].second->GetValueAsInteger();
1296 m_args_val.push_back(temp);
1307 temp.integer = (*args)[i].second->GetValueAsInteger();
1308 m_args_val.push_back(temp);
1319 temp.number_f = (*args)[i].second->GetValueAsNumber();
1320 m_args_val.push_back(temp);
1331 temp.number_d = (*args)[i].second->GetValueAsNumber();
1332 m_args_val.push_back(temp);
1355 temp.ptr = (*args)[i].second->m_value.c_str();
1356 m_args_val.push_back(temp);
1377 temp.ptr = (*args)[i].second->m_string.c_str();
1378 m_args_val.push_back(temp);
1389 if (std::holds_alternative<void *>((*args)[i].second->m_var)) {
1390 temp.ptr = std::get<void *>((*args)[i].second->m_var);
1394 LOG_RUNTIME(
"Fail convert arg '%s' to pointer!", (*args)[i].second->toString().c_str());
1397 m_args_val.push_back(temp);
1410 for (
size_t i = 0; i < m_args_val.size(); i++) {
1411 m_args_ptr.push_back((
void *) &m_args_val[i]);
1417 ffi_type *result_ffi_type =
nullptr;
1421 switch (return_type) {
1468 LOG_RUNTIME(
"Native return type '%s' not implemented!", obj.
m_prototype->m_type->asTypeString().c_str());
1472 if (
RunTime::m_ffi_prep_cif(&m_cif, FFI_DEFAULT_ABI,
static_cast<unsigned int> (m_args_type.size()), result_ffi_type, m_args_type.data()) == FFI_OK) {
1482 return Obj::CreateValue(
static_cast<uint8_t
> (res_value.integer), return_type);
1484 return Obj::CreateValue(
static_cast<int8_t
> (res_value.integer), return_type);
1486 return Obj::CreateValue(
static_cast<int16_t
> (res_value.integer), return_type);
1488 return Obj::CreateValue(
static_cast<int32_t
> (res_value.integer), return_type);
1502 result->m_var = (
void *) res_value.ptr;
1503 result->m_var_is_init =
true;
1520 for (
int i = 0; i < term->size(); i++) {
1521 ASSERT((*term)[i].second);
1522 if (term->name(i).empty()) {
1523 args->push_back(
EvalTerm((*term)[i].second, runner).GetVariablePair(
true).var.GetValueAsObject());
1526 args->push_back(
EvalTerm((*term)[i].second, runner).GetVariablePair(
true).var.GetValueAsObject(), term->name(i).c_str());
1538 result->m_class_name = term->m_name_or_class;
1548 for (
int i = 0; i < term->size(); i++) {
1549 ASSERT(!term->name(i).empty());
1550 result->push_back(
EvalTerm((*term)[i].second, runner).GetVariablePair(
true).var.GetValueAsObject(), term->name(i).c_str());
1551 result->back().second->toType_(type);
1553 if (
result->size() == 2) {
1558 result->m_var_is_init =
true;
1566 ASSERT(term->m_name_or_class.empty());
1569 if (!term->m_type) {
1581 if (!sizes.empty()) {
1588 result->m_var_is_init =
false;
1590 result->m_var_type_current = type;
1599 fmt::dynamic_format_arg_store<fmt::format_context> store;
1600 for (
int i = 0; i < args.
size(); i++) {
1602 switch (args[i].second->
getType()) {
1631 return fmt::vformat(conv_format, store);
1635 static ObjPtr int_snprintf =
RunTime::CreateNative(
"__snprintf__(buffer:Pointer, size:Int32, format:FmtChar, ... ):Int32",
nullptr,
false,
"snprintf");
1638 printf(
"%d %f\n", 100, 1.123);
1644 for (
int i = 1; i < args.
size(); i++) {
1650 int_args->push_back(args[i]);
1655 ObjPtr str_size = int_snprintf->op_call(int_args);
1658 std::string buffer(str_size->GetValueAsInteger() + 1,
'\0');
1661 int_args->at(0).second->m_var = buffer.data();
1664 str_size = int_snprintf->op_call(int_args);
1665 ASSERT(str_size->GetValueAsInteger() + 1 == buffer.size());
1672 ASSERT(!term->isBlock());
1675 switch (term->m_id) {
1678 int64_t val_int =
parseInteger(term->getText().c_str());
1690 double val_dbl =
parseDouble(term->getText().c_str());
1710 if (term->isCall()) {
1721 if (term->GetType()) {
1726 if (term->isCall()) {
1756 if (term->isNone()) {
1765 if (term->isCreate()) {
1767 }
else if (term->isNamed()) {
1796 NL_PARSER(term,
"Object '%s' (%s) not calculated!", term->m_text.c_str(), term->m_normalized.c_str());
1833 if (term->isCall()) {
1835 if (term->m_is_take) {
1840 }
else if (rvalue && term->m_right) {
1850 }
else if (term->m_is_take) {
1860 switch (term->m_id) {
1888 }
catch (std::exception & ex) {
1932 if (int_name.empty()) {
1933 LOG_RUNTIME(
"Has no internal name! AST analysis required!");
1937 if (int_name.compare(
"_") == 0) {
1939 }
else if (int_name.compare(
"$^") == 0) {
1967 auto iter = rbegin();
1968 while (iter != rend()) {
1969 auto found = iter->vars.find(name.begin());
1970 if (found != iter->vars.end()) {
1971 return &found->second;
2030 if (op->m_left->isCall()) {
2119 ASSERT(l_vars.size() == 1);
2168 bool is_named = !!op->m_right->m_left;
2170 NL_PARSER(op->m_right,
"Named ELLIPSIS NOT implemented!");
2174 bool is_last =
false;
2176 for (
size_t i = 0; i < l_vars.size(); i++) {
2177 if (l_vars[i].GetVariablePair().term->isNone()) {
2181 if (i + 1 == l_vars.size()) {
2188 if (l_vars[i].GetVariablePair().term->m_normalized.compare(op->m_right->m_right->m_normalized) == 0) {
2191 l_vars[i].GetVariablePair(
true).var.GetValueAsObject()->erase(0, l_vars.size() - 1);
2200 if (l_vars[i].GetVariablePair().term->m_normalized.compare(op->m_right->m_right->m_normalized) == 0) {
2202 l_vars[i].GetVariablePair(
true).var = right_obj;
2203 l_vars[i].GetVariablePair(
true).var.GetValueAsObject()->erase(0, 0);
2213 m_latter = l_vars[l_vars.size() - 1];
2220 NL_PARSER(op,
"Create filling not implemented!");
2231 op->m_right->RightToBlock(r_vars,
false);
2232 if (r_vars.empty()) {
2234 NL_PARSER(op,
"Delete var NOT implemented!");
2237 }
else if (r_vars.size() == 1) {
2243 for (
auto &elem : l_vars) {
2245 NL_PARSER(elem.GetVariablePair().term,
"Ellipses unexpected!");
2246 }
else if (elem.GetVariablePair().term->isNone()) {
2247 NL_PARSER(elem.GetVariablePair().term,
"None var unexpected!");
2248 }
else if (elem.GetVariablePair().term->m_right) {
2250 if (elem.GetVariablePair().term->m_right->m_id ==
TermID::INDEX) {
2252 }
else if (elem.GetVariablePair().term->m_right->m_id ==
TermID::FIELD) {
2275 if (elem.GetVariablePair().term && elem.GetVariablePair().term->m_type) {
2343 return l_vars[l_vars.size() - 1];
2352 if (elem->isNone()) {
2370 if (op->isCreateNew() && var_found && !var_found->
var.
is_undefined()) {
2371 NL_PARSER(elem,
"Object '%s' already exist", elem->m_text.c_str());
2373 NL_PARSER(elem,
"Object '%s' not exist!", elem->m_text.c_str());
2376 if (var_found && !op->isCreateNew()) {
2377 if (elem->isCall() && var_found) {
2378 NL_PARSER(elem,
"Recreate function not implemented!");
2382 if (back().vars.find(elem->m_normalized) != back().vars.end()) {
2383 NL_PARSER(elem,
"Local object '%s' already exist", elem->m_text.c_str());
2386 auto ins = back().vars.emplace(std::make_pair(elem->m_normalized,
VariablePair::Create(op->m_left, std::monostate())));
2390 var_found = &(*ins.first).second;
2393 vars.push_back(var_found);
2400 elem = elem->m_left;
2630 TermPtr index = term->m_right;
2633 switch (term->m_id) {
2637 if (index->size() > 1) {
2638 NL_PARSER(index,
"Strings and dictionaries do not support multiple dimensions!");
2663 obj->index_set_({ind->GetValueAsInteger()}, value);
2672 obj->index_set_({ind->GetValueAsInteger()}, value);
2685 TermPtr index = term->m_right;
2688 switch (term->m_id) {
2692 if (index->size() > 1) {
2693 NL_PARSER(index,
"Strings and dictionaries do not support multiple dimensions!");
2713 if (
isIndexingType(obj->m_var_type_current, obj->m_var_type_fixed)) {
2714 return obj->index_get({ind->GetValueAsInteger()});
2722 NL_PARSER(term,
"GetFieldValue not implemented!");
2727 NL_PARSER(term,
"SetFieldValue not implemented!");
2742 NL_PARSER(op,
"EvalOpOther '%s' not implemented!", op->m_text.c_str());
2754 if (op->m_text.rfind(
"=") == op->m_text.size() - 2) {
2758 if (op->m_text.find(
"+") == 0) {
2762 }
else if (op->m_text.find(
"-") == 0) {
2764 }
else if (op->m_text.find(
"*") == 0) {
2766 }
else if (op->m_text.find(
"//") == 0) {
2767 result->op_div_ceil_(value);
2768 }
else if (op->m_text.find(
"/") == 0) {
2770 }
else if (op->m_text.find(
"%") == 0) {
2773 NL_PARSER(op,
"Math operator '%s' not implemented!", op->m_text.c_str());
2789 if (op->m_text.compare(
"==") == 0) {
2791 }
else if (op->m_text.compare(
"!=") == 0) {
2793 }
else if (op->m_text.compare(
"<") == 0) {
2795 }
else if (op->m_text.compare(
"<=") == 0) {
2797 }
else if (op->m_text.compare(
">") == 0) {
2799 }
else if (op->m_text.compare(
">=") == 0) {
2801 }
else if (op->m_text.compare(
"===") == 0) {
2803 }
else if (op->m_text.compare(
"!==") == 0) {
2806 NL_PARSER(op,
"Compare operator '%s' not implemented!", op->m_text.c_str());
2814 ObjPtr cond =
Eval(term->m_left,
this).GetVariablePair(
true).var.GetValueAsObject();
2815 if (!cond->GetValueAsBoolean() && !term->m_block.empty()) {
2817 ASSERT(term->m_block.size() == 1);
2824 while (cond->GetValueAsBoolean()) {
2826 result =
Eval(term->m_right,
this).GetVariablePair(
true).var.GetValueAsObject();
2832 if (
result->m_value.empty()) {
2849 goto while_continue;
2860 cond =
Eval(term->m_left,
this).GetVariablePair(
true).var.GetValueAsObject();
2881 result =
Eval(term->m_left,
this).GetVariablePair(
true).var.GetValueAsObject();
2883 LOG_TEST(
"dowhile: %d, value: %s", (
int) i,
result->toString().c_str());
2887 if (
result->m_value.empty()) {
2904 goto dowhile_continue;
2915 cond =
Eval(term->m_right,
this).GetVariablePair(
true).var.GetValueAsObject();
2917 }
while (cond->GetValueAsBoolean());
2931 for (int64_t i = 0; i < static_cast<int64_t> (term->m_block.size()); i++) {
2933 ASSERT(term->m_block[i]);
2934 ASSERT(term->m_block[i]->m_left);
2936 bool condition =
false;
2938 ASSERT(i + 1 == term->m_block.size());
2941 ObjPtr cond =
Eval(term->m_block[i]->m_left, runner).GetVariablePair(
true).var.GetValueAsObject();
2942 condition = cond->GetValueAsBoolean();
2947 return Eval(term->m_block[i]->m_right, runner).GetVariablePair(
true).var.GetValueAsObject();
2956 NL_PARSER(term,
"The eval operator cannot be used! Use flag: --nlc-eval-enable");
2977 std::array<char, 128> buffer;
2984 std::unique_ptr<FILE,
decltype(&pclose) > pipe(popen(term->getText().c_str(),
"r"), pclose);
2986 while (fgets(buffer.data(), buffer.size(), pipe.get()) !=
nullptr) {
3025 if (op->m_left->m_text.compare(
"$") == 0) {
3046 }
else if (op->m_left->m_text.compare(
"$^") == 0) {
3048 }
else if (op->m_left->m_text.compare(
"@::") == 0) {
3060 NL_PARSER(op,
"Eval iterator for reserved word '%s' not implemented!", op->m_left->m_text.c_str());
3072 if (op->m_text.compare(
"?") == 0) {
3074 return object->IteratorMake(args.get());
3076 }
else if (op->m_text.compare(
"!") == 0) {
3078 ASSERT(!args->size() &&
"Argument processing not implemented");
3079 return object->IteratorNext(0);
3081 }
else if (op->m_text.compare(
"!!") == 0) {
3083 ASSERT(!args->size() &&
"Argument processing not implemented");
3084 object->IteratorReset();
3085 return object->IteratorData();
3087 }
else if (op->m_text.compare(
"?!") == 0 || op->m_text.compare(
"!?") == 0) {
3089 return object->IteratorData();
3091 }
else if (op->m_text.compare(
"??") == 0) {
3094 int64_t val_int = std::numeric_limits<int64_t>::max();
3095 if (args->empty() || (args->size() == 1 && args->at(0).second->is_integer())) {
3096 result =
object->IteratorMake(
nullptr,
false);
3098 val_int = args->at(0).second->GetValueAsInteger();
3100 }
else if (args->size() == 1 && args->at(0).second->is_string_type()) {
3101 result =
object->IteratorMake(args->at(0).second->GetValueAsString().c_str(),
false);
3102 }
else if (args->size() == 2 && args->at(0).second->is_string_type() && args->at(1).second->is_integer()) {
3103 result =
object->IteratorMake(args->at(0).second->GetValueAsString().c_str(),
false);
3104 val_int = args->at(1).second->GetValueAsInteger();
3107 LOG_RUNTIME(
"Iterator`s args '%s' not allowed!", args->toString().c_str());
3109 return result->IteratorNext(val_int);
3112 NL_PARSER(op,
"Eval iterator '%s' not implemented!", op->m_text.c_str());
3118 NL_PARSER(op,
"Bitwise operator '%s' not implemented!", op->m_text.c_str());
3150 switch (term->m_id) {
3164 if (term->m_right) {
3169 if (!term->m_namespace || term->m_namespace->m_text.compare(
"::") == 0) {
3176 NL_PARSER(term,
"Type RetRepeat not implemented!");
3181 result->m_value = term->m_namespace->m_text;
3183 if (!
result->m_value.empty() &&
result->m_value.rfind(
"::") !=
result->m_value.size() - 2) {
static std::string ConvertToVFormat_(const std::string_view format, T &args)
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 LatterType Eval(TermPtr ast, Context *runner)
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 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)
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)
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)
bool RegisterObject(bool only_new, const std::string_view name, TermPtr term, Variable var)
VariablePair * FindObject(const std::string_view name)
VariablePair & GetVariablePair(bool editable=false)
static LatterType Create(TermPtr term, D d)
bool is_function_type() const
virtual int64_t size() const
static ObjPtr CreateString(const std::string_view str, Sync *sync=nullptr)
std::variant< std::monostate, int64_t, double, void *, bool *, int8_t *, int16_t *, int32_t *, int64_t *, float *, double *, NativeData, std::string, TermPtr, Iterator< Obj > > m_var
ObjPtr toType(ObjType type) const
ObjType m_var_type_current
Текущий тип значения объекта
bool is_string_type() const
double GetValueAsNumber() const
std::string GetValueAsString() const
ObjPtr m_dimensions
Размерности для ObjType::Type.
static ObjPtr CreateBaseType(ObjType type)
bool is_type_name() const
ObjPtr Clone(const char *new_name=nullptr) const
std::string toString(bool deep=true) const
static ObjPtr CreateDict(Sync *sync=nullptr)
static ObjPtr CreateBool(bool value, Sync *sync=nullptr)
const TermPtr m_prototype
Описание прототипа функции (или данных)
static std::enable_if< std::is_same< T, std::string >::value||std::is_same< T, constchar * >::value, ObjPtr >::type CreateValue(T value, Sync *sync=nullptr)
static ObjPtr CreateRational(const Rational &val)
bool is_dictionary_type() const
Obj::const_iterator insert(Obj::const_iterator pos, const PairType &data)
std::string m_value
Содержит байтовую строку или байтовый массив с данными для представления в нативном виде (Struct,...
int64_t GetValueAsInteger() const
TermPtr m_sequence
Последовательно распарсенных команд для выполнения
static ObjPtr CreateNone(Sync *sync=nullptr)
static ObjPtr CreateType(ObjType type, ObjType fixed=ObjType::None, bool is_init=false, Sync *sync=nullptr)
static ObjPtr CreateNil(Sync *sync=nullptr)
static ffi_type * m_ffi_type_float
static ffi_prep_cif_type * m_ffi_prep_cif
static ffi_prep_cif_var_type * m_ffi_prep_cif_var
static std::string Escape(const std::string_view str)
static ObjType BaseTypeFromString(RunTime *rt, const std::string_view text, bool *has_error=nullptr)
static ffi_call_type * m_ffi_call
static ffi_type * m_ffi_type_sint64
static ffi_type * m_ffi_type_pointer
static ffi_type * m_ffi_type_sint8
static ffi_type * m_ffi_type_void
static void * GetNativeAddress(void *handle, const std::string_view name)
static ObjType m_wide_char_type
static ffi_type * m_ffi_type_uint8
static ffi_type * m_ffi_type_double
static ObjPtr CreateNative(const char *proto, const char *module=nullptr, bool lazzy=false, const char *mangle_name=nullptr)
static ffi_type * m_ffi_type_sint32
static ffi_type * m_ffi_type_sint16
static TermPtr CreateIntName(const std::string_view name, const std::string_view int_name, TermID id=TermID::NAME)
bool is_object_type() const
Variable Take(bool edit_mode=false, const std::chrono::milliseconds &timeout_duration=Sync::SyncTimeoutDeedlock, const std::string_view message="", const std::source_location location=std::source_location::current()) const
ObjPtr GetValueAsObject() const
bool is_undefined() const
ObjType getSummaryTensorType(Obj *obj, ObjType start=ObjType::None)
#define LOG_RUNTIME(format,...)
#define ASSERT(condition)
bool isFloatingType(ObjType t)
bool isStringChar(ObjType t)
bool isTypeName(ObjType t)
std::wstring utf8_decode(const std::string str)
bool isStringWide(ObjType t)
bool isInterrupt(ObjType t)
const VariablePair & getNonePair()
bool isIntegralType(ObjType t, bool includeBool)
std::vector< LatterType > VariablePairList
std::shared_ptr< Term > TermPtr
int64_t parseInteger(const char *str)
std::shared_ptr< Obj > ObjPtr
bool isGlobalScope(const std::string_view name)
double parseDouble(const char *str)
const ObjPtr getNoneObj()
bool isReservedName(const std::string_view name)
const Variable & getNoneVar()
std::shared_ptr< const Term > TermPtrConst
std::vector< TermPtr > BlockType
ObjType GetBaseTypeFromString(const std::string_view type_arg, bool *has_error=nullptr)
ObjType typeFromString(TermPtr &term, RunTime *rt, bool *has_error)
bool isIndexingType(ObjType curr, ObjType fix)
ObjType typeFromLimit(int64_t value, ObjType type_default=ObjType::Int64)
std::string NormalizeName(const std::string_view name)
const char * toString(TermID type)
ObjPtr FunctionType(Context *ctx, Obj &in)
bool isDefaultType(const TermPtr &term)
std::vector< int64_t > TensorShapeFromDict(const Obj *obj)
const ObjPtr getEllipsysObj()
bool canCast(const ObjType from, const ObjType to)
static VariablePair Create(TermPtr term, Variable d)
#define NL_TYPECHECK(term, from, to)
#define NL_PARSER(term, format,...)
#define NL_CHECK(cond, format,...)