Make handling of constants more robust
diff --git a/src/bc/data.c b/src/bc/data.c
index 02497f9..417e3e8 100644
--- a/src/bc/data.c
+++ b/src/bc/data.c
@@ -304,7 +304,6 @@
   switch (r->type) {
 
     case BC_RESULT_INTERMEDIATE:
-    case BC_RESULT_CONSTANT:
     {
       bc_num_free(&r->data.num);
       break;
diff --git a/src/bc/program.c b/src/bc/program.c
index 607f1d7..762376f 100644
--- a/src/bc/program.c
+++ b/src/bc/program.c
@@ -627,11 +627,14 @@
 
       case BC_INST_PRINT:
       {
-        BcResult* num;
+        BcResult* result;
+        BcNum* num;
 
-        num = bc_vec_top(&p->expr_stack);
+        result = bc_vec_top(&p->expr_stack);
 
-        bc_num_print(&num->data.num, p->obase);
+        status = bc_program_num(p, result, &num);
+
+        bc_num_print(num, p->obase);
 
         bc_vec_pop(&p->expr_stack);
 
@@ -701,30 +704,18 @@
 
       case BC_INST_OP_NEGATE:
       {
-        BcResult* ptr;
-        BcResult result;
+        BcResult* result;
+        BcNum* num;
 
-        ptr = bc_vec_top(&p->expr_stack);
+        result = bc_vec_top(&p->expr_stack);
 
-        if (!ptr) return BC_STATUS_EXEC_INVALID_EXPR;
+        if (!result) return BC_STATUS_EXEC_INVALID_EXPR;
 
-        result.type = BC_RESULT_INTERMEDIATE;
-
-        status = bc_num_init(&result.data.num, BC_NUM_DEF_SIZE);
+        status = bc_program_num(p, result, &num);
 
         if (status) return status;
 
-        status = bc_num_copy(&result.data.num, &ptr->data.num);
-
-        if (status) return status;
-
-        result.data.num.neg = !result.data.num.neg;
-
-        status = bc_vec_pop(&p->expr_stack);
-
-        if (status) return status;
-
-        status = bc_vec_push(&p->expr_stack, &result);
+        num->neg = !num->neg;
 
         break;
       }
@@ -945,6 +936,10 @@
 
       status = bc_num_parse(&result->data.num, *s, p->ibase, p->scale);
 
+      if (status) return status;
+
+      result->type = BC_RESULT_INTERMEDIATE;
+
       break;
     }