Kaynağa Gözat

Add TYPESIG and CASE macros to switch between types combinations more elegantly

master
mtardy 4 yıl önce
ebeveyn
işleme
d4af735207
2 değiştirilmiş dosya ile 25 ekleme ve 16 silme
  1. +4
    -0
      object.c
  2. +21
    -16
      parse.leg

+ 4
- 0
object.c Dosyayı Görüntüle

@ -77,6 +77,10 @@ typedef enum {
Map
} type_t;
#define NTYPES (Map + 1)
#define TYPESIG(L, R) L*NTYPES+R
#define CASE(L, R) case TYPESIG(L, R)
union object;
typedef union object *oop;

+ 21
- 16
parse.leg Dosyayı Görüntüle

@ -991,28 +991,33 @@ void runtimeError(char *msg)
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);
}
oop expandUnquotes(oop scope, oop obj)

Yükleniyor…
İptal
Kaydet