diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 0000000..7bf42e8 --- /dev/null +++ b/TODO.txt @@ -0,0 +1,5 @@ + statements + switch? + return + break in switch, loops + continue in loops diff --git a/drafts/c.c b/drafts/c.c new file mode 100644 index 0000000..233091e --- /dev/null +++ b/drafts/c.c @@ -0,0 +1,43 @@ +#include +#include + +enum jb_t { + j_function, + j_loop, + j_switch, +}; + +struct jb_record +{ + jmp_buf jb; + enum jb_t type; + oop result; + struct jb_record next; +}; + +struct jb_record *jbs= 0; + +int eval(oop ast) +{ + case t_call: { + pushJbRec(); + if (0 != set_jmp(jbs->jb)) { + oop result = jbs->result; + popJbRec(); + return result; + } + // run the body of the function here + result = (each statement in the func body...); + popJbRec(); + return result; + } + setjmp(jb); + if (n < 2) return 1; + return 1 + f(n-1) + f(n-2); +} + +int main() +{ + printf("%zi\n", sizeof(jmp_buf)); + printf("%i\n", f(5)); +} diff --git a/test2.txt b/test2.txt index 137aaab..6e41de3 100644 --- a/test2.txt +++ b/test2.txt @@ -1,10 +1,13 @@ fun f() { - if (1) { - return 12 - 15 - } else { - return 13 - 14 + var i = 0 + while (i<10) { + print(i) + if (i == 5) { + return 42 + } + else { + i = i + 1 + } } } f() \ No newline at end of file