@@ -17,70 +17,70 @@
18namespace PureScript {
18namespace PureScript {
20−#define RETURN_VALUE(TYPE, ACCESSOR, INDIRECTION) \
20+#define RETURN_VALUE(TAG, ACCESSOR, INDIRECTION) \
21 const any& variant = unthunkVariant(*this); \
21 const any& variant = unthunkVariant(*this); \
22− assert(variant.type == TYPE); \
22+ assert(variant.tag == TAG); \
23 return INDIRECTION(variant.ACCESSOR); \
23 return INDIRECTION(variant.ACCESSOR); \
25auto any::operator()(const any& arg) const -> any {
25auto any::operator()(const any& arg) const -> any {
26 const any& variant = unthunkVariant(*this);
26 const any& variant = unthunkVariant(*this);
27− if (variant.type == Type::Closure) {
27+ if (variant.tag == tag_t::Closure) {
28 return (*variant.l)(arg);
28 return (*variant.l)(arg);
30− assert(variant.type == Type::Function);
30+ assert(variant.tag == tag_t::Function);
31 return (*variant.f)(arg);
31 return (*variant.f)(arg);
34auto any::operator()(const as_thunk) const -> const any& {
34auto any::operator()(const as_thunk) const -> const any& {
35− assert(type == Type::Thunk);
35+ assert(tag == tag_t::Thunk);
36 return (*t)(unthunk);
36 return (*t)(unthunk);
39auto any::operator()() const -> any {
39auto any::operator()() const -> any {
40 const any& variant = unthunkVariant(*this);
40 const any& variant = unthunkVariant(*this);
41− if (variant.type == Type::EffClosure) {
41+ if (variant.tag == tag_t::EffClosure) {
42 return (*variant.k)();
42 return (*variant.k)();
44− assert(variant.type == Type::EffFunction);
44+ assert(variant.tag == tag_t::EffFunction);
45 return (*variant.e)();
45 return (*variant.e)();
48any::operator int() const {
48any::operator int() const {
49− RETURN_VALUE(Type::Integer, i,)
49+ RETURN_VALUE(tag_t::Integer, i,)
52any::operator double() const {
52any::operator double() const {
53− RETURN_VALUE(Type::Double, d,)
53+ RETURN_VALUE(tag_t::Double, d,)
56any::operator bool() const {
56any::operator bool() const {
57− RETURN_VALUE(Type::Boolean, b,)
57+ RETURN_VALUE(tag_t::Boolean, b,)
60any::operator char() const {
60any::operator char() const {
61− RETURN_VALUE(Type::Character, c,)
61+ RETURN_VALUE(tag_t::Character, c,)
64any::operator cstring() const {
64any::operator cstring() const {
65 const any& variant = unthunkVariant(*this);
65 const any& variant = unthunkVariant(*this);
66− if (variant.type == Type::StringLiteral) {
66+ if (variant.tag == tag_t::StringLiteral) {
67 return variant.r;
67 return variant.r;
69− assert(variant.type == Type::String);
69+ assert(variant.tag == tag_t::String);
70 return variant.s->c_str();
70 return variant.s->c_str();
73any::operator const array&() const {
73any::operator const array&() const {
74− RETURN_VALUE(Type::Array, a, *)
74+ RETURN_VALUE(tag_t::Array, a, *)
77−auto any::extractPointer(IF_DEBUG(const any::Type t)) const -> void* {
77+auto any::extractPointer(IF_DEBUG(const any::tag_t t)) const -> void* {
78 RETURN_VALUE(t, POINTER_FROM_MEMBER(p),)
78 RETURN_VALUE(t, POINTER_FROM_MEMBER(p),)
81auto any::unthunkVariant(const any& a) -> const any& {
81auto any::unthunkVariant(const any& a) -> const any& {
82 const any * variant = &a;
82 const any * variant = &a;
83− while (variant->type == Type::Thunk) {
83+ while (variant->tag == tag_t::Thunk) {
84 variant = &((*variant->t)(unthunk));
84 variant = &((*variant->t)(unthunk));
86 return *variant;
86 return *variant;
@@ -130,16 +130,16 @@ auto any::contains(const symbol_t key) const -> bool {
130#define DEFINE_CSTR_EQUALS_OPERATOR() \
130#define DEFINE_CSTR_EQUALS_OPERATOR() \
131 auto operator==(const any& lhs_, const char * rhs) -> bool { \
131 auto operator==(const any& lhs_, const char * rhs) -> bool { \
132 const any& lhs = any::unthunkVariant(lhs_); \
132 const any& lhs = any::unthunkVariant(lhs_); \
133− assert(lhs.type == any::Type::StringLiteral || lhs.type == any::Type::String); \
133+ assert(lhs.tag == any::tag_t::StringLiteral || lhs.tag == any::tag_t::String); \
134− if (lhs.type == any::Type::StringLiteral) { \
134+ if (lhs.tag == any::tag_t::StringLiteral) { \
135 return (lhs.r == rhs) || (strcmp(lhs.r, rhs) == 0); \
135 return (lhs.r == rhs) || (strcmp(lhs.r, rhs) == 0); \
137 return strcmp(lhs.s->c_str(), rhs) == 0; \
137 return strcmp(lhs.s->c_str(), rhs) == 0; \
139 auto operator==(const char * lhs, const any& rhs_) -> bool { \
139 auto operator==(const char * lhs, const any& rhs_) -> bool { \
140 const any& rhs = any::unthunkVariant(rhs_); \
140 const any& rhs = any::unthunkVariant(rhs_); \
141− assert(rhs.type == any::Type::StringLiteral || rhs.type == any::Type::String); \
141+ assert(rhs.tag == any::tag_t::StringLiteral || rhs.tag == any::tag_t::String); \
142− if (rhs.type == any::Type::StringLiteral) { \
142+ if (rhs.tag == any::tag_t::StringLiteral) { \
143 return (lhs == rhs.r) || (strcmp(lhs, rhs) == 0); \
143 return (lhs == rhs.r) || (strcmp(lhs, rhs) == 0); \
145 return strcmp(lhs, rhs.s->c_str()) == 0; \
145 return strcmp(lhs, rhs.s->c_str()) == 0; \
@@ -157,21 +157,21 @@ auto any::contains(const symbol_t key) const -> bool {
157 auto operator op (const any& lhs_, const any& rhs_) -> bool { \
157 auto operator op (const any& lhs_, const any& rhs_) -> bool { \
158 const any& lhs = any::unthunkVariant(lhs_); \
158 const any& lhs = any::unthunkVariant(lhs_); \
159 const any& rhs = any::unthunkVariant(rhs_); \
159 const any& rhs = any::unthunkVariant(rhs_); \
160− switch (lhs.type) { \
160+ switch (lhs.tag) { \
161− case any::Type::Integer: assert(lhs.type == any::Type::Integer); return lhs.i op rhs.i; \
161+ case any::tag_t::Integer: assert(lhs.tag == any::tag_t::Integer); return lhs.i op rhs.i; \
162− case any::Type::Double: assert(lhs.type == any::Type::Double); return lhs.d op rhs.d; \
162+ case any::tag_t::Double: assert(lhs.tag == any::tag_t::Double); return lhs.d op rhs.d; \
163− case any::Type::Character: assert(lhs.type == any::Type::Character); return lhs.c op rhs.c; \
163+ case any::tag_t::Character: assert(lhs.tag == any::tag_t::Character); return lhs.c op rhs.c; \
164− case any::Type::Boolean: assert(lhs.type == any::Type::Boolean); return lhs.b op rhs.b; \
164+ case any::tag_t::Boolean: assert(lhs.tag == any::tag_t::Boolean); return lhs.b op rhs.b; \
165− case any::Type::StringLiteral: \
165+ case any::tag_t::StringLiteral: \
166− assert(lhs.type == any::Type::StringLiteral || lhs.type == any::Type::String); \
166+ assert(lhs.tag == any::tag_t::StringLiteral || lhs.tag == any::tag_t::String); \
167− assert(rhs.type == any::Type::StringLiteral || rhs.type == any::Type::String); \
167+ assert(rhs.tag == any::tag_t::StringLiteral || rhs.tag == any::tag_t::String); \
168− return strcmp(lhs.r, rhs.type == any::Type::StringLiteral ? rhs.r : rhs.s->c_str()) op 0; \
168+ return strcmp(lhs.r, rhs.tag == any::tag_t::StringLiteral ? rhs.r : rhs.s->c_str()) op 0; \
169− case any::Type::String: \
169+ case any::tag_t::String: \
170− assert(lhs.type == any::Type::StringLiteral || lhs.type == any::Type::String); \
170+ assert(lhs.tag == any::tag_t::StringLiteral || lhs.tag == any::tag_t::String); \
171− assert(rhs.type == any::Type::StringLiteral || rhs.type == any::Type::String); \
171+ assert(rhs.tag == any::tag_t::StringLiteral || rhs.tag == any::tag_t::String); \
172− return strcmp(lhs.s->c_str(), rhs.type == any::Type::StringLiteral ? rhs.r : rhs.s->c_str()) op 0; \
172+ return strcmp(lhs.s->c_str(), rhs.tag == any::tag_t::StringLiteral ? rhs.r : rhs.s->c_str()) op 0; \
173− case any::Type::Pointer: return lhs.p op rhs.p; \
173+ case any::tag_t::Pointer: return lhs.p op rhs.p; \
174− default: assert(false && "Unsupported type for operator " #op); \
174+ default: assert(false && "Unsupported tag for operator " #op); \
176 return false; \
176 return false; \
@@ -197,44 +197,44 @@ DEFINE_CSTR_COMPARISON_OPERATOR(>=)
197auto operator+(const any& lhs_, const any& rhs_) -> any {
197auto operator+(const any& lhs_, const any& rhs_) -> any {
198 const any& lhs = any::unthunkVariant(lhs_);
198 const any& lhs = any::unthunkVariant(lhs_);
199 const any& rhs = any::unthunkVariant(rhs_);
199 const any& rhs = any::unthunkVariant(rhs_);
200− switch (lhs.type) {
200+ switch (lhs.tag) {
201− case any::Type::Integer: assert(lhs.type == any::Type::Integer); return lhs.i + rhs.i;
201+ case any::tag_t::Integer: assert(lhs.tag == any::tag_t::Integer); return lhs.i + rhs.i;
202− case any::Type::Double: assert(lhs.type == any::Type::Double); return lhs.d + rhs.d;
202+ case any::tag_t::Double: assert(lhs.tag == any::tag_t::Double); return lhs.d + rhs.d;
203− case any::Type::Character: assert(lhs.type == any::Type::Character); return any(char(lhs.c + rhs.c));
203+ case any::tag_t::Character: assert(lhs.tag == any::tag_t::Character); return any(char(lhs.c + rhs.c));
204− case any::Type::StringLiteral:
204+ case any::tag_t::StringLiteral:
205− assert(lhs.type == any::Type::StringLiteral || lhs.type == any::Type::String);
205+ assert(lhs.tag == any::tag_t::StringLiteral || lhs.tag == any::tag_t::String);
206− assert(rhs.type == any::Type::StringLiteral || rhs.type == any::Type::String);
206+ assert(rhs.tag == any::tag_t::StringLiteral || rhs.tag == any::tag_t::String);
207− return rhs.type == any::Type::StringLiteral ? std::string(lhs.r) + rhs.r : lhs.r + *rhs.s;
207+ return rhs.tag == any::tag_t::StringLiteral ? std::string(lhs.r) + rhs.r : lhs.r + *rhs.s;
208− case any::Type::String:
208+ case any::tag_t::String:
209− assert(lhs.type == any::Type::StringLiteral || lhs.type == any::Type::String);
209+ assert(lhs.tag == any::tag_t::StringLiteral || lhs.tag == any::tag_t::String);
210− assert(rhs.type == any::Type::StringLiteral || rhs.type == any::Type::String);
210+ assert(rhs.tag == any::tag_t::StringLiteral || rhs.tag == any::tag_t::String);
211− return rhs.type == any::Type::StringLiteral ? *lhs.s + rhs.r : *lhs.s + *rhs.s;
211+ return rhs.tag == any::tag_t::StringLiteral ? *lhs.s + rhs.r : *lhs.s + *rhs.s;
212− default: assert(false && "Unsupported type for '+' operator");
212+ default: assert(false && "Unsupported tag for '+' operator");
214 return nullptr;
214 return nullptr;
217auto operator+(const any& lhs_, const char * rhs) -> std::string {
217auto operator+(const any& lhs_, const char * rhs) -> std::string {
218 const any& lhs = any::unthunkVariant(lhs_);
218 const any& lhs = any::unthunkVariant(lhs_);
219− assert(lhs.type == any::Type::StringLiteral || lhs.type == any::Type::String);
219+ assert(lhs.tag == any::tag_t::StringLiteral || lhs.tag == any::tag_t::String);
220− return lhs.type == any::Type::StringLiteral ? std::string(lhs.r) + rhs : *lhs.s + rhs;
220+ return lhs.tag == any::tag_t::StringLiteral ? std::string(lhs.r) + rhs : *lhs.s + rhs;
223auto operator+(const char * lhs, const any& rhs_) -> std::string {
223auto operator+(const char * lhs, const any& rhs_) -> std::string {
224 const any& rhs = any::unthunkVariant(rhs_);
224 const any& rhs = any::unthunkVariant(rhs_);
225− assert(rhs.type == any::Type::StringLiteral || rhs.type == any::Type::String);
225+ assert(rhs.tag == any::tag_t::StringLiteral || rhs.tag == any::tag_t::String);
226− return rhs.type == any::Type::StringLiteral ? lhs + std::string(rhs.r) : lhs + *rhs.s;
226+ return rhs.tag == any::tag_t::StringLiteral ? lhs + std::string(rhs.r) : lhs + *rhs.s;
229auto operator-(const any& lhs_, const any& rhs_) -> any {
229auto operator-(const any& lhs_, const any& rhs_) -> any {
230 const any& lhs = any::unthunkVariant(lhs_);
230 const any& lhs = any::unthunkVariant(lhs_);
231 const any& rhs = any::unthunkVariant(rhs_);
231 const any& rhs = any::unthunkVariant(rhs_);
232− assert(lhs.type == rhs.type);
232+ assert(lhs.tag == rhs.tag);
233− switch (lhs.type) {
233+ switch (lhs.tag) {
234− case any::Type::Integer: return lhs.i - rhs.i;
234+ case any::tag_t::Integer: return lhs.i - rhs.i;
235− case any::Type::Double: return lhs.d - rhs.d;
235+ case any::tag_t::Double: return lhs.d - rhs.d;
236− case any::Type::Character: return any(char(lhs.c - rhs.c));
236+ case any::tag_t::Character: return any(char(lhs.c - rhs.c));
237− default: assert(false && "Unsupported type for '-' operator");
237+ default: assert(false && "Unsupported tag for '-' operator");
239 return nullptr;
239 return nullptr;
@@ -242,12 +242,12 @@ auto operator-(const any& lhs_, const any& rhs_) -> any {
242auto operator*(const any& lhs_, const any& rhs_) -> any {
242auto operator*(const any& lhs_, const any& rhs_) -> any {
243 const any& lhs = any::unthunkVariant(lhs_);
243 const any& lhs = any::unthunkVariant(lhs_);
244 const any& rhs = any::unthunkVariant(rhs_);
244 const any& rhs = any::unthunkVariant(rhs_);
245− assert(lhs.type == rhs.type);
245+ assert(lhs.tag == rhs.tag);
246− switch (lhs.type) {
246+ switch (lhs.tag) {
247− case any::Type::Integer: return lhs.i * rhs.i;
247+ case any::tag_t::Integer: return lhs.i * rhs.i;
248− case any::Type::Double: return lhs.d * rhs.d;
248+ case any::tag_t::Double: return lhs.d * rhs.d;
249− case any::Type::Character: return any(char(lhs.c * rhs.c));
249+ case any::tag_t::Character: return any(char(lhs.c * rhs.c));
250− default: assert(false && "Unsupported type for '*' operator");
250+ default: assert(false && "Unsupported tag for '*' operator");
252 return nullptr;
252 return nullptr;
@@ -255,12 +255,12 @@ auto operator*(const any& lhs_, const any& rhs_) -> any {
255auto operator/(const any& lhs_, const any& rhs_) -> any {
255auto operator/(const any& lhs_, const any& rhs_) -> any {
256 const any& lhs = any::unthunkVariant(lhs_);
256 const any& lhs = any::unthunkVariant(lhs_);
257 const any& rhs = any::unthunkVariant(rhs_);
257 const any& rhs = any::unthunkVariant(rhs_);
258− assert(lhs.type == rhs.type);
258+ assert(lhs.tag == rhs.tag);
259− switch (lhs.type) {
259+ switch (lhs.tag) {
260− case any::Type::Integer: return lhs.i / rhs.i;
260+ case any::tag_t::Integer: return lhs.i / rhs.i;
261− case any::Type::Double: return lhs.d / rhs.d;
261+ case any::tag_t::Double: return lhs.d / rhs.d;
262− case any::Type::Character: return any(char(lhs.c / rhs.c));
262+ case any::tag_t::Character: return any(char(lhs.c / rhs.c));
263− default: assert(false && "Unsupported type for '/' operator");
263+ default: assert(false && "Unsupported tag for '/' operator");
265 return nullptr;
265 return nullptr;
@@ -268,11 +268,11 @@ auto operator/(const any& lhs_, const any& rhs_) -> any {
268auto operator%(const any& lhs_, const any& rhs_) -> any {
268auto operator%(const any& lhs_, const any& rhs_) -> any {
269 const any& lhs = any::unthunkVariant(lhs_);
269 const any& lhs = any::unthunkVariant(lhs_);
270 const any& rhs = any::unthunkVariant(rhs_);
270 const any& rhs = any::unthunkVariant(rhs_);
271− assert(lhs.type == rhs.type);
271+ assert(lhs.tag == rhs.tag);
272− switch (lhs.type) {
272+ switch (lhs.tag) {
273− case any::Type::Integer: return lhs.i % rhs.i;
273+ case any::tag_t::Integer: return lhs.i % rhs.i;
274− case any::Type::Character: return any(char(lhs.c % rhs.c));
274+ case any::tag_t::Character: return any(char(lhs.c % rhs.c));
275− default: assert(false && "Unsupported type for '%' operator");
275+ default: assert(false && "Unsupported tag for '%' operator");
277 return nullptr;
277 return nullptr;
@@ -280,10 +280,10 @@ auto operator%(const any& lhs_, const any& rhs_) -> any {
280// unary negate
280// unary negate
281auto operator-(const any& rhs_) -> any {
281auto operator-(const any& rhs_) -> any {
282 const any& rhs = any::unthunkVariant(rhs_);
282 const any& rhs = any::unthunkVariant(rhs_);
283− switch (rhs.type) {
283+ switch (rhs.tag) {
284− case any::Type::Integer: return (- rhs.i);
284+ case any::tag_t::Integer: return (- rhs.i);
285− case any::Type::Double: return (- rhs.d);
285+ case any::tag_t::Double: return (- rhs.d);
286− default: assert(false && "Unsupported type for unary '-' operator");
286+ default: assert(false && "Unsupported tag for unary '-' operator");
288 return nullptr;
288 return nullptr;