#assert false
#assert nil
assert "123"
- return true
}
TestBoolOps()
assert true && true
assert true || false
assert false || true
- return true
}
TestIntOps()
assert (84 / 2) == 42
assert (21 * 2) == 42
assert (11 % 5) == 1
-
- return true
}
TestRealOps()
assert (84 / 2) == 42
assert (21 * 2) == 42
#assert (11 % 5) == 1 # Not valid for reals
+}
+TestStringOps()
+{
+ assert "foo" == "foo"
+ assert "foo" != "bar"
+ assert ("foo" + "bar") == "foobar"
+ assert ("foo" + 123) == "foo123"
+ assert ("foo" + 123.0) == "foo123.000000"
+ assert ("foo" + true) == "footrue"
+ assert ("foo" + false) == "foofalse"
+# assert length("foo") == 3
}
-init()
+Main()
{
+ def foo = 123
+ def bar = foo
TestLiterals()
TestBoolOps()
TestIntOps()
TestRealOps()
+ TestStringOps()
return true
}
val = ToString(MakeReal(42.5));
assert(!strcmp(ValueAsString(val)->bytes, "42.500000"));
- extern Value init(void);
- (void)init();
+ extern Value Main(void);
+ (void)Main();
return 0;
}
result = MakeInt(ValueAsInt(left) + ValueAsInt(right));
} else if (IsReal(left)) {
result = MakeReal(ValueAsReal(left) + ValueAsReal(right));
+ } else if (IsString(left)) {
+ right = ToString(right);
+ String* left_str = ValueAsString(left);
+ String* right_str = ValueAsString(right);
+ size_t sz = left_str->length + right_str->length;
+ String* str = calloc(sizeof(String) + sz + 1, 1);
+ str->length = sz;
+ memcpy(
+ str->bytes,
+ left_str->bytes,
+ left_str->length);
+ memcpy(
+ &str->bytes[left_str->length],
+ right_str->bytes,
+ right_str->length + 1);
+ result = (Value){ .as_uint64 = (NAN_TAG_STRING | (uint64_t)str) };
} else {
fprintf(stderr, "fatal error: addition operator used on invalid type\n");
exit(1);
result = MakeBool(ValueAsInt(left) == ValueAsInt(right));
} else if (IsReal(left)) {
result = MakeBool(ValueAsReal(left) == ValueAsReal(right));
+ } else if (IsString(left)) {
+ result = MakeBool(!strcmp(ValueAsString(left)->bytes, ValueAsString(right)->bytes));
} else {
result = MakeBool(false);
}
result = MakeBool(ValueAsInt(left) != ValueAsInt(right));
} else if (IsReal(left)) {
result = MakeBool(ValueAsReal(left) != ValueAsReal(right));
+ } else if (IsString(left)) {
+ result = MakeBool(0 != strcmp(ValueAsString(left)->bytes, ValueAsString(right)->bytes));
} else {
result = MakeBool(false);
}