FIX: nested lambdas closures.

main
bog 2023-09-26 11:29:39 +02:00
parent 58a2c69634
commit 5499e4569e
2 changed files with 19 additions and 2 deletions

View File

@ -14,6 +14,9 @@ namespace fk
explicit Lambda(std::shared_ptr<Program> program, size_t arity);
virtual ~Lambda();
std::unordered_map<addr_t, std::shared_ptr<Constant>>
get_all_env() const { return m_env; }
size_t arity() const { return m_arity; }
addr_t base_addr() const { return m_base_addr; }
@ -22,8 +25,11 @@ namespace fk
std::shared_ptr<Program> program() const { return m_program; }
bool has_env(addr_t addr) const;
std::shared_ptr<Constant> get_env(addr_t addr) const;
void add_env(addr_t addr, std::shared_ptr<Constant> constant);
size_t env_size() const { return m_env.size(); }
private:

View File

@ -204,8 +204,11 @@ namespace fk
m_pc++;
break;
}
std::cout << "noooo" << std::endl;
m_pc++;
std::cerr << "cannot find addr '"
<< instr.param
<< "'" << std::endl;
abort();
} break;
case OP_NOT: {
@ -254,6 +257,14 @@ namespace fk
{
lambda->add_env(e.first, e.second);
}
if (f.lambda)
{
for (auto e: f.lambda->get_all_env())
{
lambda->add_env(e.first, e.second);
}
}
}
push(frame().program->add(ref));