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;
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:
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;
"$: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