summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_builtin.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-02 22:56:01 -0700
committerKeith Packard <keithp@keithp.com>2017-02-20 11:16:49 -0800
commit11cb03b1d336ee90c422be27588f57be573a9546 (patch)
tree944a9c36379c02383081fd3246395158f662ce7b /src/lisp/ao_lisp_builtin.c
parent9e1a787f8828fb7b750ad3310c89a89536ea5286 (diff)
altos/lisp: Separate out values from atoms
This enables changing values of atoms declared as constants, should enable lets, and with some work, even lexical scoping. this required changing the constant computation to run ao_lisp_collect() before dumping the block of constant data, and that uncovered some minor memory manager bugs. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_builtin.c')
-rw-r--r--src/lisp/ao_lisp_builtin.c37
1 files changed, 28 insertions, 9 deletions
diff --git a/src/lisp/ao_lisp_builtin.c b/src/lisp/ao_lisp_builtin.c
index 63fb69fd..8c481793 100644
--- a/src/lisp/ao_lisp_builtin.c
+++ b/src/lisp/ao_lisp_builtin.c
@@ -14,6 +14,31 @@
#include "ao_lisp.h"
+static int
+builtin_size(void *addr)
+{
+ (void) addr;
+ return sizeof (struct ao_lisp_builtin);
+}
+
+static void
+builtin_mark(void *addr)
+{
+ (void) addr;
+}
+
+static void
+builtin_move(void *addr)
+{
+ (void) addr;
+}
+
+const struct ao_lisp_type ao_lisp_builtin_type = {
+ .size = builtin_size,
+ .mark = builtin_mark,
+ .move = builtin_move
+};
+
void
ao_lisp_builtin_print(ao_poly b)
{
@@ -120,20 +145,12 @@ ao_lisp_quote(struct ao_lisp_cons *cons)
ao_poly
ao_lisp_set(struct ao_lisp_cons *cons)
{
- ao_poly atom, val;
if (!check_argc(cons, 2, 2))
return AO_LISP_NIL;
if (!check_argt(cons, 0, AO_LISP_ATOM, 0))
return AO_LISP_NIL;
- atom = cons->car;
- val = ao_lisp_poly_cons(cons->cdr)->car;
- if (ao_lisp_is_const(atom)) {
- ao_lisp_exception |= AO_LISP_INVALID;
- return AO_LISP_NIL;
- }
- ao_lisp_poly_atom(atom)->val = val;
- return val;
+ return ao_lisp_atom_set(cons->car, ao_lisp_poly_cons(cons->cdr)->car);
}
ao_poly
@@ -157,6 +174,8 @@ ao_lisp_print(struct ao_lisp_cons *cons)
val = cons->car;
ao_lisp_poly_print(val);
cons = ao_lisp_poly_cons(cons->cdr);
+ if (cons)
+ printf(" ");
}
return val;
}