diff --git a/lang/number.c b/lang/number.c index ef76256..e6b7a0b 100644 --- a/lang/number.c +++ b/lang/number.c @@ -37,8 +37,7 @@ static void number_add( struct object *obj, int arg_count, struct object **args) { - abort_if( - arg_count != 2, "number_add called with more than 2 arguments"); + abort_if(arg_count != 2, "number_add called without 2 arguments"); abort_if(args[0] != NULL, "number_add return is not NULL"); abort_if(!args[1], "number_add arg is NULL"); abort_if(obj->class_data != &num_class, @@ -51,8 +50,23 @@ args[0] = number_create(added); } -static struct object_call calls[] = { - {.name = "Add", .handler = number_add}, {.name = NULL, /* end */}}; +static void number_minus( + struct object *obj, int arg_count, struct object **args) { + abort_if(arg_count != 2, "number_minus called without 2 arguments"); + abort_if(args[0] != NULL, "number_minus return is not NULL"); + abort_if(!args[1], "number_minus arg is NULL"); + abort_if(obj->class_data != &num_class, + "number_minus obj is not a number"); + abort_if(args[1]->class_data != &num_class, + "number_minus arg is not a number"); + struct number *numA = (struct number *)obj; + struct number *numB = (struct number *)args[1]; + int subbed = numA->value - numB->value; + args[0] = number_create(subbed); +} + +static struct object_call calls[] = {{.name = "Add", .handler = number_add}, + {.name = "Minus", .handler = number_minus}, {.name = NULL, /* end */}}; static struct object_class num_class = { .cleanup = number_cleanup,