3using namespace std::literals;
20 const auto&
id = annex->
id;
41 auto _ = e.world().push(
loc());
43 for (
const auto&
import :
imports())
import->emit(e);
44 for (
const auto& decl :
decls()) decl->emit(e);
67 auto _ = e.world().push(
loc());
80 auto _ = e.world().push(
loc());
81 return type() ?
type()->
emit(e) : e.world().mut_hole_type();
91 auto _ = e.world().push(
loc());
97 auto type = e.world().type_infer_univ();
98 sigma = e.world().mut_sigma(type, n);
100 auto var = sigma->
var();
101 auto& sym2idx = e.sigma2sym2idx[sigma];
103 for (
size_t i = 0; i != n; ++i) {
106 if (
auto id =
ptrn(i)->isa<IdPtrn>()) sym2idx[
id->dbg().sym()] = i;
114 auto _ = e.world().push(
loc());
115 type = type ? type : e.world().type_infer_univ();
116 return e.world().mut_sigma(type,
num_ptrns());
124 auto _ = e.world().push(
loc());
138 return e.world().type(l);
144 case Tag::K_Univ:
return e.world().univ();
145 case Tag::K_Nat:
return e.world().type_nat();
146 case Tag::K_Idx:
return e.world().type_idx();
147 case Tag::K_Bool:
return e.world().type_bool();
148 case Tag::K_ff:
return e.world().lit_ff();
149 case Tag::K_tt:
return e.world().lit_tt();
150 case Tag::K_i1:
return e.world().lit_i1();
151 case Tag::K_i8:
return e.world().lit_i8();
152 case Tag::K_i16:
return e.world().lit_i16();
153 case Tag::K_i32:
return e.world().lit_i32();
154 case Tag::K_i64:
return e.world().lit_i64();
155 case Tag::K_I1:
return e.world().type_i1();
156 case Tag::K_I8:
return e.world().type_i8();
157 case Tag::K_I16:
return e.world().type_i16();
158 case Tag::K_I32:
return e.world().type_i32();
159 case Tag::K_I64:
return e.world().type_i64();
160 case Tag::T_star:
return e.world().type<0>();
161 case Tag::T_box:
return e.world().type<1>();
162 default: fe::unreachable();
173 case Tag::L_u:
return t ? e.world().lit(t,
tok().lit_u()) : e.world().lit_nat(
tok().lit_u());
174 case Tag::L_i:
return tok().
lit_i();
175 case Tag::L_c:
return e.world().lit_i8(
tok().lit_c());
176 case Tag::L_str:
return e.world().tuple(
tok().sym());
177 case Tag::T_bot:
return t ? e.world().bot(t) : e.world().type_bot();
178 case Tag::T_top:
return t ? e.world().top(t) : e.world().type_top();
179 default: fe::unreachable();
186 for (
const auto& decl :
decls() | std::ranges::views::reverse) decl->emit(e);
188 for (
const auto& decl :
decls()) decl->emit(e);
193 return decl_ = e.world().mut_pi(type,
false)->set(
loc());
197 decl_->set_dom(dom()->
emit(e));
198 decl_->set_codom(codom()->
emit(e));
202 auto d = dom()->emit(e);
203 auto c = codom()->emit(e);
204 return e.world().pi(d, c);
212 auto sigma = e.world().mut_sigma(2)->set(
loc());
213 auto var = sigma->var()->set(
ret()->
loc().anew_begin());
214 sigma->set(0, dom_t);
217 sigma->set(1, ret_t);
219 if (
auto imm = sigma->immutabilize())
231 return dom()->decl_ = e.world().mut_pi(type, dom()->is_implicit())->set(
loc());
238 auto cod = codom() ? codom()->emit(e) : e.world().type_bot();
239 return dom()->set_codom(cod);
252 auto c =
callee()->emit(e);
253 auto a =
arg()->emit(e);
254 return is_explicit() ? e.world().app(c, a) : e.world().implicit_app(c, a);
258 auto c =
callee()->emit(e);
260 auto con = e.world().mut_lam(cn);
261 auto pair = e.world().tuple({
arg()->emit(e), con});
262 auto app = e.world().app(c, pair)->set(c->loc() +
arg()->
loc());
263 ptrn()->emit_value(e, con->var());
268 error(c->loc(),
"callee of a ret expression must type as a returning continuation but got '{}' of type '{}'", c,
278 return e.world().tuple(
elems);
282 auto s =
shape()->emit_type(e);
283 if (
shape()->dbg().is_anon()) {
284 auto b =
body()->emit(e);
285 return arr ? e.world().arr(s, b) : e.world().pack(s, b);
288 auto t = e.world().type_infer_univ();
289 auto a = e.world().mut_arr(t);
294 shape()->emit_value(e, var);
296 if (
auto imm = a->immutabilize())
return imm;
299 auto p = e.world().mut_pack(a);
301 shape()->emit_value(e, var);
302 auto b =
body()->emit(e);
303 a->set_body(b->type());
305 if (
auto imm = p->immutabilize())
return imm;
314 auto tup =
tuple()->emit(e);
315 if (
auto dbg = std::get_if<Dbg>(&
index())) {
316 if (
auto sigma = tup->type()->isa_mut<
Sigma>()) {
317 if (
auto i = e.sigma2sym2idx.find(sigma); i != e.sigma2sym2idx.end()) {
318 auto sigma = i->first->as_mut<
Sigma>();
319 const auto& sym2idx = i->second;
320 if (
auto i = sym2idx.find(dbg->sym()); i != sym2idx.end())
321 return e.world().extract(tup, sigma->num_ops(), i->second);
325 if (
decl())
return e.world().extract(tup,
decl()->def());
326 error(dbg->loc(),
"cannot resolve index '{}' for extraction", dbg);
329 auto expr = std::get<Ptr<Expr>>(
index()).
get();
330 auto i = expr->emit(e);
331 return e.world().extract(tup, i);
335 auto t =
tuple()->emit(e);
336 auto i =
index()->emit(e);
337 auto v =
value()->emit(e);
338 return e.world().insert(t, i, v);
348 mim_type_ =
type()->emit(e);
349 auto&
id = annex_->id;
353 if (curry_.lit_u() >
id.curry)
354 error(curry_.loc(),
"curry counter cannot be greater than {}",
id.curry);
356 id.curry = curry_.lit_u();
360 if (trip_.lit_u() >
id.curry)
361 error(trip_.loc(),
"trip counter cannot be greater than curry counter '{}'", (
int)
id.curry);
363 id.trip = trip_.lit_u();
366 auto pi = mim_type_->isa<
Pi>();
369 else if (
bool(pi) ^
bool(*annex_->pi))
370 error(
dbg().
loc(),
"all declarations of annex '{}' have to be function types if any is",
dbg().sym());
373 auto norm = e.driver().normalizer(
id.plugin,
id.tag, 0);
374 auto axiom = e.world().axiom(norm,
id.
curry,
id.
trip, mim_type_,
id.plugin,
id.tag, 0)->set(
dbg());
376 e.world().register_annex(
id.plugin,
id.tag, 0, axiom);
378 sub_t offset = annex_->subs.size();
380 auto& aliases = annex_->subs.emplace_back(std::deque<Sym>());
381 sub_t s = i + offset;
382 auto norm = e.driver().normalizer(
id.plugin,
id.tag, s);
383 auto name = e.world().sym(
dbg().sym().str() +
"."s +
sub(i).front()->
dbg().sym().str());
384 auto axiom = e.world().axiom(norm,
id.
curry,
id.
trip, mim_type_,
id.plugin,
id.tag, s)->set(name);
385 e.world().register_annex(
id.plugin,
id.tag, s, axiom);
387 for (
const auto& alias :
sub(i)) {
389 aliases.emplace_back(alias->dbg().sym());
396 auto v =
value()->emit(e);
398 e.register_annex(annex_, sub_,
def_);
402 for (
auto curr =
this; curr; curr = curr->next()) curr->emit_decl(e);
403 for (
auto curr =
this; curr; curr = curr->next()) curr->emit_body(e);
407 auto t =
type() ?
type()->emit(e) : e.world().type_infer_univ();
415 e.register_annex(annex_, sub_,
def_);
420 auto var = lam_->var();
423 ptrn()->emit_value(e, var->proj(2, 0));
424 ret()->emit_value(e, var->proj(2, 1));
426 ptrn()->emit_value(e, var);
433 auto _ = e.world().push(
loc());
434 bool is_cps = tag_ == Tag::K_cn || tag_ == Tag::K_con || tag_ == Tag::K_fn || tag_ == Tag::K_fun;
437 for (
size_t i = 0, n =
num_doms(); i != n; ++i) {
438 for (
const auto&
dom :
doms() | std::ranges::views::drop(i))
dom->emit_type(e);
439 auto cod =
codom() ?
codom()->emit(e) : is_cps ? e.world().type_bot() : e.world().mut_hole_type();
441 for (
const auto&
dom :
doms() | std::ranges::views::drop(i) | std::ranges::views::reverse)
442 cod =
dom->set_codom(cod);
445 auto lam = cur->emit_value(e);
446 auto filter = cur->filter() ? cur->filter()->emit(e)
447 : i + 1 == n && is_cps ? e.world().lit_ff()
448 : e.world().lit_tt();
449 lam->set_filter(filter);
454 dom(i - 1)->lam_->set_body(lam);
461 e.register_annex(annex_, sub_,
def_);
465 auto dom_t =
dom()->emit_type(e);
466 if (
tag() == Tag::K_cfun) {
467 auto ret_t =
codom()->emit(e);
468 def_ = e.world().mut_fun(dom_t, ret_t)->set(
dbg());
470 def_ = e.world().mut_con(dom_t)->set(
dbg());
static std::pair< u8, u8 > infer_curry_and_trip(const Def *type)
Def * set(size_t i, const Def *)
Successively set from left to right.
T * as_mut() const
Asserts that this is a mutable, casts constness away and performs a static_cast to T.
const Def * var(nat_t a, nat_t i) noexcept
Some "global" variables needed all over the place.
A dependent function type.
static const Pi * has_ret_pi(const Def *d)
Yields the Pi::ret_pi() of d, if it is in fact a Pi.
const Def * immutabilize() override
Tries to make an immutable from a mutable.
Sigma * set(size_t i, const Def *def)
The World represents the whole program and manages creation of MimIR nodes (Defs).
const Driver & driver() const
const Def * register_annex(flags_t f, const Def *)
const Def * emit_value(Emitter &, const Def *) const override
const Def * emit_type(Emitter &) const override
const Ptrn * ptrn() const
const Def * emit_(Emitter &) const override
const Expr * callee() const
const Expr * body() const
const Def * emit_(Emitter &) const override
const IdPtrn * shape() const
void emit_body(Emitter &, const Def *decl) const override
const Def * emit_decl(Emitter &, const Def *type) const override
const Def * emit_(Emitter &) const override
const Expr * type() const
void emit(Emitter &) const override
const auto & sub(size_t i) const
void emit(Emitter &) const override
const Expr * codom() const
const Expr * expr() const
const Def * emit_(Emitter &) const override
const auto & decls() const
absl::node_hash_map< Sigma *, fe::SymMap< size_t >, GIDHash< const Def * >, GIDEq< const Def * > > sigma2sym2idx
void register_annex(AnnexInfo *annex, sub_t sub, const Def *def)
const Def * emit_(Emitter &) const override
const Def * emit_type(Emitter &) const override
const Def * emit_value(Emitter &, const Def *) const override
const Def * emit(Emitter &) const
virtual const Def * emit_(Emitter &) const =0
const Def * emit_type(Emitter &) const override
const Def * emit_value(Emitter &, const Def *) const override
const IdPtrn * id() const
const Def * emit_(Emitter &) const override
const Def * emit_(Emitter &) const override
const Decl * decl() const
const Def * emit_type(Emitter &) const override
const Def * emit_value(Emitter &, const Def *) const override
const Expr * type() const
void emit(Emitter &) const
const Module * module() const
const Expr * index() const
const Expr * tuple() const
const Def * emit_(Emitter &) const override
const Expr * value() const
Lam * emit_value(Emitter &) const
const Ptrs< Dom > & doms() const
const Expr * codom() const
void emit_decl(Emitter &) const override
void emit_body(Emitter &) const override
const Dom * dom(size_t i) const
void emit_body(Emitter &, const Def *decl) const override
const Def * emit_(Emitter &) const override
const LamDecl * lam() const
const Def * emit_decl(Emitter &, const Def *type) const override
const Expr * value() const
const Ptrn * ptrn() const
void emit(Emitter &) const override
const Expr * type() const
const Def * emit_(Emitter &) const override
const auto & decls() const
const auto & implicit_imports() const
const auto & imports() const
virtual void emit_type(Emitter &) const
const IdPtrn * ret() const
const Ptrn * ptrn() const
const Def * emit_(Emitter &) const override
const Def * emit_decl(Emitter &, const Def *type) const override
void emit_body(Emitter &, const Def *decl) const override
virtual const Def * emit_value(Emitter &, const Def *) const =0
virtual const Def * emit_type(Emitter &) const =0
void emit(Emitter &) const override
virtual void emit_body(Emitter &) const
virtual void emit_decl(Emitter &) const
const Expr * body() const
const Expr * type() const
const Ptrn * ptrn() const
const Def * emit_(Emitter &) const override
const Expr * body() const
const Expr * callee() const
const TuplePtrn * ptrn() const
const Def * emit_(Emitter &) const override
void emit_body(Emitter &, const Def *decl) const override
const Def * emit_decl(Emitter &, const Def *type) const override
const Lit * lit_i() const
const Expr * elem(size_t i) const
const Def * emit_(Emitter &) const override
const auto & elems() const
const Ptrn * ptrn(size_t i) const
const Def * emit_type(Emitter &) const override
const Def * emit_decl(Emitter &, const Def *type) const
const Def * emit_value(Emitter &, const Def *) const override
const Def * emit_body(Emitter &, const Def *decl) const
const Def * emit_(Emitter &) const override
const Expr * level() const
const Expr * inhabitant() const
const Def * emit_(Emitter &) const override
Vector< const Def * > DefVec
void error(Loc loc, const char *f, Args &&... args)
constexpr decltype(auto) get(Span< T, N > span) noexcept
struct mim::ast::AnnexInfo::@177100250272201136376142224053244231100060214216 id