aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2024-06-16 08:10:59 -0400
committerClyne Sullivan <clyne@bitgloo.com>2024-06-16 08:10:59 -0400
commitc546646cd46e9b523c3457fa6e867951ac37daba (patch)
tree9f0c75a45c6b0cbb5ca221209471bbfb60eed6cd
parentd832f781dbc57b9a6223150db07343ea990fb611 (diff)
move list impl to forsp
-rw-r--r--support.c31
-rw-r--r--test.fp8
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("<stack> ");
+ 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