mescc: Support assignment with comparison.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 18 Mar 2017 07:25:15 +0000 (08:25 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 18 Mar 2017 07:25:15 +0000 (08:25 +0100)
* module/language/c99/compiler.mes (expr->accu): Handle assignment -> accu.
* doc/examples/t.c (test): Test it.
* doc/examples/mini-mes.c (eval_apply): Use it.

module/language/c99/compiler.mes
scaffold/mini-mes.c
scaffold/t.c

index 59db6ac8b33d243ee1abbc51cc9961166d8d7d12..50424a86f5758a3155a770941a9044dba7468859 100644 (file)
@@ -798,6 +798,11 @@ _)))))
         ((cast ,cast ,o)
          ((expr->accu info) o))
 
+        ((assn-expr (p-expr (ident ,name)) ,op ,expr)
+         (let ((info ((ast->info info) o)))
+           (clone info #:text (append (.text info)
+                                      ((ident->accu info) name)))))
+
         (_
          (format (current-error-port) "SKIP: expr->accu=~s\n" o)
          barf
index 9b14d42cb8b4c66eeb446c6dc434ee1b48da8750..81488d55eb30d180bb6d95e3b88c8712d07526ad 100644 (file)
@@ -913,10 +913,8 @@ eval_apply ()
   SCM macro;
   SCM expanders;
  macro_expand:
-#if __GNUC__
-  //FIXME
   if (TYPE (r1) == TPAIR
-      && (macro = lookup_macro (car (r1), r0)) != cell_f) // FIXME GNUC
+      && (macro = lookup_macro (car (r1), r0)) != cell_f)
     {
       r1 = cons (macro, CDR (r1));
       goto apply;
@@ -933,7 +931,6 @@ eval_apply ()
           goto apply;
         }
     }
-#endif
   goto vm_return;
  begin:
   x = cell_unspecified;
@@ -1341,7 +1338,6 @@ bload_env (SCM a) ///((internal))
   g_stdin = STDIN;
   r0 = mes_builtins (r0);
 #if 1
-  //__GNUC__
   puts ("symbols: ");
   SCM s = g_symbols;
   while (s && s != cell_nil) {
index b119329551beda4fb5af1cf7284143f108ba74f9..81fb64ea5f091520c1d03bd64b43f01557424988 100644 (file)
@@ -534,6 +534,12 @@ test (char *p)
   puts ("t: if (!(t = 1)) ?\n");
   if (!(t = 1)) return 1;
 
+  puts ("t: if ((f = 0) != 0) ?\n");
+  if ((f = 0) != 0) return 1;
+
+  puts ("t: if ((t = 1) != 1) ?\n");
+  if ((t = 1) != 1) return 1;
+
   puts ("t: (one == 1) ?\n");
   (one == 1) ? 1 : exit (1);