diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2024-06-16 08:10:59 -0400 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2024-06-16 08:10:59 -0400 |
commit | c546646cd46e9b523c3457fa6e867951ac37daba (patch) | |
tree | 9f0c75a45c6b0cbb5ca221209471bbfb60eed6cd | |
parent | d832f781dbc57b9a6223150db07343ea990fb611 (diff) |
move list impl to forsp
-rw-r--r-- | support.c | 31 | ||||
-rw-r--r-- | test.fp | 8 |
2 files changed, 27 insertions, 12 deletions
@@ -40,32 +40,39 @@ void eq() st[sp - 1] = st[sp - 1] == st[sp]; } -void cons() +void alloc() +{ + int32_t *st = &stack; + st[sp - 1] = (int32_t)malloc(st[sp - 1] * sizeof(int32_t)); +} + +void dealloc() { int32_t *st = &stack; - int32_t *pair = (int32_t *)malloc(2 * sizeof(int32_t)); --sp; - pair[0] = st[sp]; - pair[1] = st[sp - 1]; - st[sp - 1] = (int32_t)pair; + free((int32_t *)st[sp]); } -void car() +void peek() { int32_t *st = &stack; - st[sp - 1] = ((int32_t *)st[sp - 1])[0]; + st[sp - 1] = *(int32_t *)st[sp - 1]; } -void cdr() +void poke() { int32_t *st = &stack; - st[sp - 1] = ((int32_t *)st[sp - 1])[1]; + sp -= 2; + int32_t *ptr = (int32_t *)st[sp + 1]; + *ptr = st[sp]; } -void decons() +void dumpstack() { int32_t *st = &stack; - --sp; - free((int32_t *)st[sp]); + printf("<stack> "); + for (int i = 0; i < sp; ++i) + printf("%d ", st[i]); + putchar('\n'); } @@ -11,6 +11,14 @@ ($x x) $force (10 emit) $cr (print) $print + (4 +) $cell+ + ($a $d 2 alloc $p + ^a ^p poke + ^d ^p cell+ poke + ^p + ) $cons + (peek) $car + (cell+ peek) $cdr ; if-stmt ($c $t $f c ^f ^t rot cswap $_ force) $if |