Ivyc s3

include reader
include pass_flat
include pass_typeinfer
include ivy_to_cpp

instance argv : sys_argv(pos,str)
instance pid : arith_int
instance retcode : arith_int
instance cmd : sys.command(pid,vector[str],retcode)

object ivy { ...
    action show_expr(e:expr) = {
    call stdio.writeln(e.enc)
    }
    action show_ident(id:ident) = {
    call stdio.writeln(id.to_str)
    }
}

object cpp { ...
    action show_expr(e:expr) = {
    call stdio.writeln(e.enc)
    }
}

action usage = {
    stdio.writeln("usage: ivyc <file>.ivy");
}

init {
    if argv.end > 1 {
    var name := argv.value(1);
    ivy.prog.file_to_cpp(name);
    if ivy.errors.end = 0 {
        var cpp_name := ivy.path.change_extension(name,"cpp");
        var com : vector[str];
        com := com.append("g++");
        com := com.append("-O2");
        var idx := ivy.include_path.begin;
        while idx < ivy.include_path.end {
        com := com.append("-I");
        com := com.append(ivy.include_path.value(idx));
        idx := idx.next
        };
        com := com.append("-o");
        var bin_name := ivy.path.drop_extension(name);
        com := com.append(bin_name);
        com := com.append("-std=c++17");
        com := com.append(cpp_name);
        var full_com := com.value(0);
        var jdx := com.begin.next;
        while jdx < com.end {
        full_com := full_com.extend(" ");
        full_com := full_com.extend(com.value(jdx));
        jdx := jdx.next
        };
        stdio.writeln(full_com);
        var p := cmd.command(com);
        var rc := cmd.wait(p);
        if rc = 0 {
        stdio.writeln("success");
        } else {
        stdio.writeln("error returned");
        }
    }
    } else {
    usage
    }
}