|
@@ -3701,6 +3701,14 @@ int mexpr_greater(node_t *a, node_t *b) {
|
|
|
node_t *mexpr_eval(node_t *n) {
|
|
|
if (n)
|
|
|
switch (n->tag) {
|
|
|
+ case N_LITERAL:
|
|
|
+ if (n->t->tag == T_NAME) {
|
|
|
+ node_t *v = const_get(n->t->text);
|
|
|
+ if (v)
|
|
|
+ return mexpr_eval(v);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
case N_UNARY_PLUS: return mexpr_eval(n->a); break;
|
|
|
case N_NEGATE: {
|
|
|
node_t *a = mexpr_eval(n->a);
|
|
@@ -3712,6 +3720,12 @@ node_t *mexpr_eval(node_t *n) {
|
|
|
node_t *a = mexpr_eval(n->a);
|
|
|
node_t *b = mexpr_eval(n->b);
|
|
|
|
|
|
+ if (!IS_NUMBER(a) && IS_NUMBER(b))
|
|
|
+ return node2(N_ADD, n->a, b);
|
|
|
+
|
|
|
+ if (IS_NUMBER(a) && !IS_NUMBER(b))
|
|
|
+ return node2(N_ADD, a, n->b);
|
|
|
+
|
|
|
return mexpr_add(a, b);
|
|
|
}
|
|
|
|
|
@@ -3719,6 +3733,12 @@ node_t *mexpr_eval(node_t *n) {
|
|
|
node_t *a = mexpr_eval(n->a);
|
|
|
node_t *b = mexpr_eval(n->b);
|
|
|
|
|
|
+ if (!IS_NUMBER(a) && IS_NUMBER(b))
|
|
|
+ return node2(N_SUB, n->a, b);
|
|
|
+
|
|
|
+ if (IS_NUMBER(a) && !IS_NUMBER(b))
|
|
|
+ return node2(N_SUB, a, n->b);
|
|
|
+
|
|
|
return mexpr_sub(a, b);
|
|
|
}
|
|
|
|
|
@@ -3726,6 +3746,12 @@ node_t *mexpr_eval(node_t *n) {
|
|
|
node_t *a = mexpr_eval(n->a);
|
|
|
node_t *b = mexpr_eval(n->b);
|
|
|
|
|
|
+ if (!IS_NUMBER(a) && IS_NUMBER(b))
|
|
|
+ return node2(N_MUL, n->a, b);
|
|
|
+
|
|
|
+ if (IS_NUMBER(a) && !IS_NUMBER(b))
|
|
|
+ return node2(N_MUL, a, n->b);
|
|
|
+
|
|
|
return mexpr_mul(a, b);
|
|
|
}
|
|
|
|
|
@@ -3733,6 +3759,12 @@ node_t *mexpr_eval(node_t *n) {
|
|
|
node_t *a = mexpr_eval(n->a);
|
|
|
node_t *b = mexpr_eval(n->b);
|
|
|
|
|
|
+ if (!IS_NUMBER(a) && IS_NUMBER(b))
|
|
|
+ return node2(N_DIV, n->a, b);
|
|
|
+
|
|
|
+ if (IS_NUMBER(a) && !IS_NUMBER(b))
|
|
|
+ return node2(N_DIV, a, n->b);
|
|
|
+
|
|
|
return mexpr_div(a, b);
|
|
|
}
|
|
|
|
|
@@ -5345,7 +5377,7 @@ char *compile(char *source, list_t *required) {
|
|
|
buffer_t *buf = buffer_new();
|
|
|
|
|
|
compile_into("const __QIC = \"" QIC_VERSION "\"", gbuf, buf, ctx, ltab, lstk, sstk, lbl);
|
|
|
- compile_into("macro E(x)$:E(x)", gbuf, buf, ctx, ltab, lstk, sstk, lbl);
|
|
|
+ compile_into("macro E(x) {\n$set r E(x)\n$if r = nil\n$x\n$else\n$r\n$endif}", gbuf, buf, ctx, ltab, lstk, sstk, lbl);
|
|
|
|
|
|
if (required && required->length)
|
|
|
for (size_t i = 0; i < required->length; i++)
|