/* Value Type Conversions
*************************************************/
-static Value ToString(Value val) {
- Value retval;
- if (IsString(val)) {
- retval = val;
- } else if (IsNil(val)) {
- retval = MakeString("nil");
- } else if (IsBool(val)) {
- retval = MakeString(IsTrue(val) ? "true" : "false");
- } else if (IsInt(val)) {
- char str[64];
- snprintf(str, sizeof(str), "%d", ValueAsInt(val));
- retval = MakeString(str);
- } else if (IsReal(val)) {
- char str[64];
- snprintf(str, sizeof(str), "%f", ValueAsReal(val));
- retval = MakeString(str);
- } else {
- assert(!"could not convert string");
- }
- return retval;
-}
+Value ToString(Value val);
+
/* Builtin Functions
*************************************************/
/* Binary Operators
*************************************************/
-
-static inline Value OpAdd(Value left, Value right) {
- Value result;
- if (IsInt(left)) {
- 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);
- }
- return result;
-}
-
-static inline Value OpSub(Value left, Value right) {
- Value result;
- if (IsInt(left)) {
- result = MakeInt(ValueAsInt(left) - ValueAsInt(right));
- } else if (IsReal(left)) {
- result = MakeReal(ValueAsReal(left) - ValueAsReal(right));
- } else {
- fprintf(stderr, "fatal error: addition operator used on invalid type\n");
- exit(1);
- }
- return result;
-}
-
-static inline Value OpMul(Value left, Value right) {
- Value result;
- if (IsInt(left)) {
- result = MakeInt(ValueAsInt(left) * ValueAsInt(right));
- } else if (IsReal(left)) {
- result = MakeReal(ValueAsReal(left) * ValueAsReal(right));
- } else {
- fprintf(stderr, "fatal error: addition operator used on invalid type\n");
- exit(1);
- }
- return result;
-}
-
-static inline Value OpDiv(Value left, Value right) {
- Value result;
- if (IsInt(left)) {
- result = MakeInt(ValueAsInt(left) / ValueAsInt(right));
- } else if (IsReal(left)) {
- result = MakeReal(ValueAsReal(left) / ValueAsReal(right));
- } else {
- fprintf(stderr, "fatal error: addition operator used on invalid type\n");
- exit(1);
- }
- return result;
-}
-
-static inline Value OpMod(Value left, Value right) {
- Value result;
- if (IsInt(left)) {
- result = MakeInt(ValueAsInt(left) % ValueAsInt(right));
- } else {
- fprintf(stderr, "fatal error: addition operator used on invalid type\n");
- exit(1);
- }
- return result;
-}
-
-static inline Value OpLt(Value left, Value right) {
- Value result;
- if (IsInt(left)) {
- result = MakeBool(ValueAsInt(left) < ValueAsInt(right));
- } else if (IsReal(left)) {
- result = MakeBool(ValueAsReal(left) < ValueAsReal(right));
- } else {
- result = MakeBool(false);
- }
- return result;
-}
-
-static inline Value OpLtEq(Value left, Value right) {
- Value result;
- if (IsInt(left)) {
- result = MakeBool(ValueAsInt(left) <= ValueAsInt(right));
- } else if (IsReal(left)) {
- result = MakeBool(ValueAsReal(left) <= ValueAsReal(right));
- } else {
- result = MakeBool(false);
- }
- return result;
-}
-
-static inline Value OpGt(Value left, Value right) {
- Value result;
- if (IsInt(left)) {
- result = MakeBool(ValueAsInt(left) > ValueAsInt(right));
- } else if (IsReal(left)) {
- result = MakeBool(ValueAsReal(left) > ValueAsReal(right));
- } else {
- result = MakeBool(false);
- }
- return result;
-}
-
-static inline Value OpGtEq(Value left, Value right) {
- Value result;
- if (IsInt(left)) {
- result = MakeBool(ValueAsInt(left) >= ValueAsInt(right));
- } else if (IsReal(left)) {
- result = MakeBool(ValueAsReal(left) >= ValueAsReal(right));
- } else {
- result = MakeBool(false);
- }
- return result;
-}
-
-static inline Value OpEq(Value left, Value right) {
- Value result;
- if (IsBool(left)) {
- result = MakeBool(ValueAsBool(left) == ValueAsBool(right));
- } else if (IsInt(left)) {
- 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);
- }
- return result;
-}
-
-static inline Value OpNeq(Value left, Value right) {
- Value result;
- if (IsBool(left)) {
- result = MakeBool(ValueAsBool(left) != ValueAsBool(right));
- } else if (IsInt(left)) {
- 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);
- }
- return result;
-}
+Value OpAdd(Value left, Value right);
+Value OpSub(Value left, Value right);
+Value OpMul(Value left, Value right);
+Value OpDiv(Value left, Value right);
+Value OpMod(Value left, Value right);
+Value OpLt(Value left, Value right);
+Value OpLtEq(Value left, Value right);
+Value OpGt(Value left, Value right);
+Value OpGtEq(Value left, Value right);
+Value OpEq(Value left, Value right);
+Value OpNeq(Value left, Value right);
/* Arrays And Hashes
*************************************************/
-static void Array_Set(Value array, int index, Value value)
-{
-}
+void Array_Set(Value array, int index, Value value);
+Value Array_Get(Value array, int index);
-static Value Array_Get(Value array, int index)
-{
- return MakeNil();
-}
+void Hash_Set(Value hash, Value key, Value value);
+Value Hash_Get(Value hash, Value key);
-static void Hash_Set(Value hash, Value key, Value value)
-{
-}
-
-static Value Hash_Get(Value hash, Value key)
-{
- return MakeNil();
-}
-
-static Value Object_Get(Value object, Value key)
-{
- return MakeNil();
-}
-
-static Value Object_Set(Value object, Value key, Value value)
-{
- return MakeNil();
-}
+Value Object_Get(Value object, Value key);
+Value Object_Set(Value object, Value key, Value value);