FIX: nested lambdas closures.
parent
58a2c69634
commit
5499e4569e
|
@ -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:
|
||||
|
|
15
src/VM.cpp
15
src/VM.cpp
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue