int main() { value_t v1 = box_value( INT, 22 ); value_t v2 = box_value( INT, 33 ); value_t vls[] = { v1, v2 }; list_t vl = { 2, vls }; value_t vs = box_value( LIST, vl ); value_t vp = box_value( PROC, &proc1 ); value_t vr = (*(function_t*)unbox_value(vp))(vs); printf("result: %d\n", *(int*)unbox_value(vr)); return *(int*)unbox_value(vr); }
inline svalue_t * box_double(double x) { svalue_t *val = malloc(sizeof (svalue_t)); CHECK(val); svalue_variants_t value_val; value_val.doublev = x; *val = box_value(value_val, RTS_DOUBLE); return val; }
inline svalue_t * box_float(float x) { svalue_t *val = malloc(sizeof (svalue_t)); CHECK(val); svalue_variants_t value_val; value_val.floating = x; *val = box_value(value_val, RTS_FLOAT); return val; }
inline svalue_t * box_int(int x) { svalue_t *val = malloc(sizeof (svalue_t)); CHECK(val); svalue_variants_t value_val; value_val.integer = x; *val = box_value(value_val, RTS_INT); return val; }
inline svalue_t * box_closure(sc_closure_t *closure) { svalue_t *val = malloc(sizeof (svalue_t)); CHECK(val); svalue_variants_t value_val; value_val.closure = closure; *val = box_value(value_val, RTS_CLOSURE); return val; }
inline svalue_t * box_string(char *chars, size_t n) { sc_string_t strval; strval.string = chars; strval.size = n; svalue_t *val = malloc(sizeof (svalue_t)); CHECK(val); svalue_variants_t value_val; value_val.string = strval; *val = box_value(value_val, RTS_STRING); return val; }
inline svalue_t * box_pair(svalue_t *left, svalue_t *right) { sc_pair_t pair; pair.left = left; pair.right = right; svalue_t *val = malloc(sizeof (svalue_t)); CHECK(val); svalue_variants_t value_val; value_val.pair = pair; *val = box_value(value_val, PAIR); return val; }
inline value_p box_list(long numargs, ...) // TODO: not beautiful to have special handler for lists { list_p l = malloc( sizeof(struct _list_t) ); l->size = numargs; l->vs = malloc( sizeof(value_p) * numargs ); box_value(list, LIST, l); va_list args; va_start(args, numargs); for (long i = 0; i < numargs; i++) { list->LIST->vs[i] = va_arg(args, value_p); } va_end(args); return list; }
ptr<json::value> object::clone() const noexcept(false) { return box_value(*this); }
value_t op_inc(value_t v) { value_t result = box_value( INT, v.INT + 1 ); // FIXME: unsafe! return result; }