txlyre 1 روز پیش
والد
کامیت
6a95550d4a
1فایلهای تغییر یافته به همراه33 افزوده شده و 1 حذف شده
  1. 33 1
      qic.c

+ 33 - 1
qic.c

@@ -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++)