Procházet zdrojové kódy

Merge pull request #18 from mtardy/type-switch

Add TYPESIG and CASE macros to switch between types combinations more elegantly
pull/19/head
piumarta před 4 roky
odevzdal GitHub
rodič
revize
11dd4554a0
V databázi nebyl nalezen žádný známý klíč pro tento podpis ID GPG klíče: 4AEE18F83AFDEB23
2 změnil soubory, kde provedl 29 přidání a 16 odebrání
  1. +2
    -0
      object.c
  2. +27
    -16
      parse.leg

+ 2
- 0
object.c Zobrazit soubor

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

+ 27
- 16
parse.leg Zobrazit soubor

@ -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);

Načítá se…
Zrušit
Uložit