// meta_constant level.instantiate : level → list (name × level) → list level vm_obj level_instantiate(vm_obj const & o, vm_obj const & lst) { level const & l = to_level(o); buffer<name> ns; buffer<level> ls; vm_obj it = lst; while (!is_simple(it)) { vm_obj const & h = cfield(it, 0); ns.push_back(to_name(cfield(h, 0))); ls.push_back(to_level(cfield(h, 1))); it = cfield(it, 1); } return to_obj(instantiate(l, to_list(ns), to_list(ls))); }
unsigned level_cases_on(vm_obj const & o, buffer<vm_obj> & data) { level const & l = to_level(o); switch (l.kind()) { case level_kind::Zero: break; case level_kind::Succ: data.push_back(to_obj(succ_of(l))); break; case level_kind::Max: data.push_back(to_obj(max_lhs(l))); data.push_back(to_obj(max_rhs(l))); break; case level_kind::IMax: data.push_back(to_obj(imax_lhs(l))); data.push_back(to_obj(imax_rhs(l))); break; case level_kind::Param: data.push_back(to_obj(param_id(l))); break; case level_kind::Global: data.push_back(to_obj(global_id(l))); break; case level_kind::Meta: data.push_back(to_obj(meta_id(l))); break; } return static_cast<unsigned>(l.kind()); }
vm_obj level_fold(vm_obj const &, vm_obj const & l, vm_obj const & a, vm_obj const & fn) { vm_obj r = a; for_each(to_level(l), [&](level const & o) { r = invoke(fn, to_obj(o), r); return true; }); return r; }
vm_obj level_lex_lt(vm_obj const & o1, vm_obj const & o2) { return mk_vm_bool(is_lt(to_level(o1), to_level(o2), false)); }
vm_obj level_has_decidable_eq(vm_obj const & o1, vm_obj const & o2) { return mk_vm_bool(to_level(o1) == to_level(o2)); }
vm_obj level_imax(vm_obj const & o1, vm_obj const & o2) { return to_obj(mk_imax(to_level(o1), to_level(o2))); }
vm_obj level_succ(vm_obj const & o) { return to_obj(mk_succ(to_level(o))); }
vm_obj level_to_format(vm_obj const & l, vm_obj const & o) { return to_obj(pp(to_level(l), to_options(o))); }
vm_obj level_to_string(vm_obj const & l) { std::ostringstream out; out << to_level(l); return to_obj(out.str()); }
vm_obj level_occurs(vm_obj const & o1, vm_obj const & o2) { return mk_vm_bool(occurs(to_level(o1), to_level(o2))); }
vm_obj level_normalize(vm_obj const & o) { return to_obj(normalize(to_level(o))); }
vm_obj level_eqv(vm_obj const & o1, vm_obj const & o2) { return mk_vm_bool(is_equivalent(to_level(o1), to_level(o2))); }
char* add_to_image(int row,unsigned char *b,int w) { int i; for(i=0;i<w;i++) image[i][row] = to_level(b,i); }
static int has_placeholder(lua_State * L) { if (is_expr(L, 1)) return push_boolean(L, has_placeholder(to_expr(L, 1))); else return push_boolean(L, has_placeholder(to_level(L, 1))); }