From c546646cd46e9b523c3457fa6e867951ac37daba Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Sun, 16 Jun 2024 08:10:59 -0400 Subject: [PATCH] move list impl to forsp --- support.c | 31 +++++++++++++++++++------------ test.fp | 8 ++++++++ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/support.c b/support.c index 44b4583..b400a05 100644 --- a/support.c +++ b/support.c @@ -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(" "); + for (int i = 0; i < sp; ++i) + printf("%d ", st[i]); + putchar('\n'); } diff --git a/test.fp b/test.fp index e4aba6c..2ae975d 100644 --- a/test.fp +++ b/test.fp @@ -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