@@ -26,7 +26,8 @@ namespace PureScript {
2626 case Type::String: new (&s) shared<string> (src.s); break; \
2727 case Type::Map: new (&m) shared<map> (src.m); break; \
2828 case Type::Vector: new (&v) shared<vector> (src.v); break; \
29− case Type::Function: new (&f) shared<fn> (src.f); break; \
29+ case Type::Function: f = src.f; break; \
30+ case Type::Closure: new (&l) shared<closure> (src.l); break; \
3031 case Type::EffFunction: new (&e) shared<eff_fn> (src.e); break; \
3132 case Type::Thunk: t = src.t; break; \
3233 case Type::Pointer: new (&p) shared<void> (src.p); break; \
@@ -44,7 +45,8 @@ namespace PureScript {
4445 case Type::String: new (&s) shared<string> (std::move(src.s)); break; \
4546 case Type::Map: new (&m) shared<map> (std::move(src.m)); break; \
4647 case Type::Vector: new (&v) shared<vector> (std::move(src.v)); break; \
47− case Type::Function: new (&f) shared<fn> (std::move(src.f)); break; \
48+ case Type::Function: f = src.f; break; \
49+ case Type::Closure: new (&l) shared<closure> (std::move(src.l)); break; \
4850 case Type::EffFunction: new (&e) shared<eff_fn> (std::move(src.e)); break; \
4951 case Type::Thunk: t = src.t; break; \
5052 case Type::Pointer: new (&p) shared<void> (std::move(src.p)); break; \
@@ -86,7 +88,8 @@ any::~any() {
8688 case Type::String: s.~shared<string>(); break;
8789 case Type::Map: m.~shared<map>(); break;
8890 case Type::Vector: v.~shared<vector>(); break;
89− case Type::Function: f.~shared<fn>(); break;
91+ case Type::Function: ; break;
92+ case Type::Closure: l.~shared<closure>(); break;
9093 case Type::EffFunction: e.~shared<eff_fn>(); break;
9194 case Type::Thunk: ; break;
9295 case Type::Pointer: p.~shared<void>(); break;
@@ -163,6 +166,9 @@ any::~any() {
163166 if (type == Type::Function) {
164167 return (*f)(arg);
165168 }
169+ if (type == Type::Closure) {
170+ return (*l)(arg);
171+ }
166172 const any* valuePtr = this;
167173 do {
168174 assert(valuePtr->type == Type::Thunk);
@@ -170,6 +176,9 @@ any::~any() {
170176 if (value.type == Type::Function) {
171177 return (*value.f)(arg);
172178 }
179+ if (value.type == Type::Closure) {
180+ return (*value.l)(arg);
181+ }
173182 valuePtr = &value;
174183 } while (valuePtr->type != Type::Unknown);
175184 assert(false && "Unknown value type");