8using namespace std::string_literals;
12static_assert(
sizeof(
void*) <=
sizeof(
u64),
"pointer doesn't fit into Lit");
17const Def* do_reify(
const Def* def) {
18 auto& world = def->
world();
19 return world.
lit(world.call<
Code>(def->
type()),
reinterpret_cast<u64>(def));
23const Def* do_reflect(
const Def* def) {
return reinterpret_cast<const Def*
>(def->as<
Lit>()->
get()); }
25void debug_print(
const Def* lvl,
const Def* def) {
26 auto& world = def->
world();
27 auto level = fe::Log::Level::Debug;
29 level = std::to_underlying(fe::Log::Level::Error) <=
int(*l)
30 &&
int(*l) <= std::to_underlying(fe::Log::Level::Debug)
31 ?
static_cast<fe::Log::Level
>(*l)
32 : fe::Log::Level::Debug;
34 world.
log().log(level,
"{}debug_print: {}{}", fe::term::FG::Yellow, def, fe::term::FG::Reset);
35 world.log().log(level, def->
loc(),
"def : {}", def);
37 world.log().log(level, def->
type()->
loc(),
"type: {}", def->
type());
38 world.log().log(level, def->
loc(),
"node: {}", def->
node_name());
39 world.log().log(level, def->
loc(),
"ops : {}", def->
num_ops());
40 world.log().log(level, def->
loc(),
"proj: {}", def->
num_projs());
41 world.log().log(level, def->
loc(),
"eops: {}", def->
num_deps());
48 auto [lvl, x] = arg->
projs<2>();
62 auto [a, b] = arg->
projs<2>();
67 if (res ^ eq) arg->
blame(
"'{}' and '{}' {}alpha-equivalent", a, b, !res ?
"not " :
"").bail();
70 if (res ^ eq) arg->
blame(
"'{}' and '{}' {}structural-equivalent", a, b, !res ?
"not " :
"").bail();
76 if (!arg->isa<
Bot>()) c->blame(
"'{}' is not bottom", arg).bail();
81 auto& w =
type->world();
82 auto [cond, val, msg] = arg->
projs<3>();
84 if (cond == w.lit_tt())
return val;
85 if (cond == w.lit_ff()) {
87 if (s.empty()) s =
"unknown error"s;
static bool alpha(const Def *d1, const Def *d2)
size_t num_deps() const noexcept
World & world() const noexcept
std::string_view node_name() const
auto projs(F f) const
Splits this Def via Def::projections into an Array (if A == std::dynamic_extent) or std::array (other...
const Def * type() const noexcept
Yields the "raw" type of this Def (maybe nullptr).
fe::Error & blame(fe::cite_string< Args... > s, Args &&... args) const
Reports an error that blames this; chain Error::n for Notes and Error::bail to throw.
nat_t num_projs() const
Yields Def::arity(), if it is a Lit, or 1 otherwise.
constexpr u32 gid() const noexcept
Global id - unique number for this Def.
std::string unique_name() const
name + "_" + Def::gid
constexpr size_t num_ops() const noexcept
static std::optional< T > isa(const Def *def)
const Lit * lit(const Def *type, u64 val)
const fe::Log & log() const
Log via log().e("...", args) etc.; owned by the Driver.
const Lit * lit_nat(nat_t a)
const Def * normalize_reify(const Def *, const Def *, const Def *arg)
const Def * normalize_dbg(const Def *, const Def *, const Def *arg)
const Def * normalize_check(const Def *type, const Def *, const Def *arg)
const Def * normalize_check_bot(const Def *, const Def *c, const Def *arg)
const Def * normalize_equiv(const Def *, const Def *, const Def *arg)
const Def * normalize_gid(const Def *, const Def *, const Def *arg)
const Def * normalize_type(const Def *, const Def *, const Def *arg)
const Def * normalize_reflect(const Def *, const Def *, const Def *arg)
std::string tuple2str(const Def *)
#define MIM_refly_NORMALIZER_IMPL