FIX: nested lambdas closures.
parent
58a2c69634
commit
5499e4569e
|
@ -14,6 +14,9 @@ namespace fk
|
||||||
explicit Lambda(std::shared_ptr<Program> program, size_t arity);
|
explicit Lambda(std::shared_ptr<Program> program, size_t arity);
|
||||||
virtual ~Lambda();
|
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; }
|
size_t arity() const { return m_arity; }
|
||||||
|
|
||||||
addr_t base_addr() const { return m_base_addr; }
|
addr_t base_addr() const { return m_base_addr; }
|
||||||
|
@ -22,8 +25,11 @@ namespace fk
|
||||||
std::shared_ptr<Program> program() const { return m_program; }
|
std::shared_ptr<Program> program() const { return m_program; }
|
||||||
|
|
||||||
bool has_env(addr_t addr) const;
|
bool has_env(addr_t addr) const;
|
||||||
|
|
||||||
|
|
||||||
std::shared_ptr<Constant> get_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);
|
void add_env(addr_t addr, std::shared_ptr<Constant> constant);
|
||||||
|
size_t env_size() const { return m_env.size(); }
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
15
src/VM.cpp
15
src/VM.cpp
|
@ -204,8 +204,11 @@ namespace fk
|
||||||
m_pc++;
|
m_pc++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
std::cout << "noooo" << std::endl;
|
|
||||||
m_pc++;
|
std::cerr << "cannot find addr '"
|
||||||
|
<< instr.param
|
||||||
|
<< "'" << std::endl;
|
||||||
|
abort();
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case OP_NOT: {
|
case OP_NOT: {
|
||||||
|
@ -254,6 +257,14 @@ namespace fk
|
||||||
{
|
{
|
||||||
lambda->add_env(e.first, e.second);
|
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));
|
push(frame().program->add(ref));
|
||||||
|
|
Loading…
Reference in New Issue