Browse Source

Merge pull request #18 from mtardy/type-switch

Add TYPESIG and CASE macros to switch between types combinations more elegantly
master
piumarta 4 years ago
committed by GitHub
parent
commit
11dd4554a0
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 16 deletions
  1. +2
    -0
      object.c
  2. +27
    -16
      parse.leg

+ 2
- 0
object.c View File

@ -77,6 +77,8 @@ typedef enum {
Map
} type_t;
#define NTYPES (Map + 1)
union object;
typedef union object *oop;

+ 27
- 16
parse.leg View File

@ -989,32 +989,43 @@ void runtimeError(char *msg)
exit(1);
}
#define TYPESIG(L, R) L*NTYPES+R
#define CASE(L, R) case TYPESIG(L, R)
oop addOperation(oop ast, oop lhs, oop rhs)
{
if (getType(lhs) == Integer && getType(rhs) == Integer) {
return makeInteger(getInteger(lhs) + getInteger(rhs));
} else if (getType(lhs) == String && getType(rhs) == String) {
return string_concat(lhs, rhs);
} else {
runtimeError("addition between two incompatible types");
assert(0); // to prevent: control may reach end of non-void function
switch (TYPESIG(getType(lhs), getType(rhs))) {
CASE(Integer, Integer): {
return makeInteger(getInteger(lhs) + getInteger(rhs));
}
CASE(String, String): {
return string_concat(lhs, rhs);
}
}
runtimeError("addition between two incompatible types");
assert(0); // to prevent: control may reach end of non-void function
}
oop mulOperation(oop ast, oop lhs, oop rhs)
{
if (getType(lhs) == Integer && getType(rhs) == Integer) {
return makeInteger(getInteger(lhs) * getInteger(rhs));
} else if (getType(lhs) == String && getType(rhs) == Integer) {
return string_mul(lhs, rhs);
} else if (getType(lhs) == Integer && getType(rhs) == String) {
return string_mul(rhs, lhs);
} else {
runtimeError("multiplication between two incompatible types");
assert(0);
switch (TYPESIG(getType(lhs), getType(rhs))) {
CASE(Integer, Integer): {
return makeInteger(getInteger(lhs) * getInteger(rhs));
}
CASE(String, Integer): {
return string_mul(lhs, rhs);
}
CASE(Integer, String): {
return string_mul(rhs, lhs);
}
}
runtimeError("multiplication between two incompatible types");
assert(0);
}
#undef TYPESIG
#undef CASE
oop expandUnquotes(oop scope, oop obj)
{
obj = clone(obj);

Loading…
Cancel
Save