]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
First attempt at generating code for if statements. horribly broken.
authorMichael D. Lowis <mike@mdlowis.com>
Tue, 29 Dec 2015 03:28:06 +0000 (22:28 -0500)
committerMichael D. Lowis <mike@mdlowis.com>
Tue, 29 Dec 2015 03:28:06 +0000 (22:28 -0500)
source/anf.c
source/codegen.c
spec/anf_spec.rb

index 2f3e8c5f7943ff1bfc5df37e96efaf620116e9b7..3cc1f76a7b679d5a9904bd04e37a61b2e8e7a784 100644 (file)
@@ -19,14 +19,10 @@ static bool isatomic(AST* tree)
 
 static bool isconst(AST* tree) {
     bool ret = isatomic(tree);
-    if (!ret) {
-        if (tree->type == AST_FNAPP) {
-            ret = isatomic(fnapp_fn(tree));
-            for (int i = 0; i < vec_size(fnapp_args(tree)); i++) {
-                ret = ret && isatomic(vec_at(fnapp_args(tree), i));
-            }
-        } else if (tree->type == AST_IF) {
-            ret = isatomic(ifexpr_cond(tree));
+    if (!ret && tree->type == AST_FNAPP) {
+        ret = isatomic(fnapp_fn(tree));
+        for (int i = 0; i < vec_size(fnapp_args(tree)); i++) {
+            ret = ret && isatomic(vec_at(fnapp_args(tree), i));
         }
     }
     return ret;
index 996985016fe045e6be8de910328517ac2622cd7a..32b6f0d854e302cbe04456da61a99fa2582a9d54 100644 (file)
@@ -48,6 +48,16 @@ void codegen(FILE* file, AST* tree)
             break;
 
         case AST_IF:
+            fprintf(file,"    if (");
+            codegen(file, ifexpr_cond(tree));
+            fprintf(file,")\n");
+            codegen(file, ifexpr_then(tree));
+            if (ifexpr_else(tree)) {
+                fprintf(file,"\n    else\n");
+                codegen(file, ifexpr_else(tree));
+            } else {
+                fprintf(file,"    {return nil;}");
+            }
             break;
 
         case AST_FUNC:
@@ -75,12 +85,18 @@ void codegen(FILE* file, AST* tree)
             break;
 
         case AST_LET:
-            fprintf(file,"{val ");
+            fprintf(file,"    {val ");
             codegen(file, let_var(tree));
             fprintf(file," = ");
             codegen(file, let_val(tree));
-            fprintf(file,";");
-            codegen(file, let_body(tree));
+            fprintf(file,";\n");
+            if (let_body(tree)->type != AST_LET && let_body(tree)->type != AST_IF) {
+                fprintf(file,"    return ");
+                codegen(file, let_body(tree));
+                fprintf(file,";");
+            } else {
+                codegen(file, let_body(tree));
+            }
             fprintf(file,"}");
             break;
 
index a22ee6d056ee2db9b26cc20042e8eaf53a5d436d..52fce54601e2d12c1dc9a743a7adc5902923bd3d 100644 (file)
@@ -132,5 +132,14 @@ describe "sclpl a-normal form" do
                 "$:0"]]]
       ])
     end
+
+    it "should normalize a literal with a complex expression" do
+      expect(anf('fn() if 1 2 else 3;;')).to eq([
+        ["fn", [],
+          ["let", ["$:1", ["T_ID:bar"]],
+            ["let", ["$:0", ["T_ID:foo", "$:1"]],
+                "$:0"]]]
+      ])
+    end
   end
 end