From 770767c11e377919e6776c15562b439bf5954e36 Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Fri, 20 Jan 2017 12:27:09 +0000 Subject: [PATCH] Now have quote. Everything still seems to work. Unit tests still pass. --- src/init.c | 7 +++++++ src/lispops.c | 13 +++++++++++++ src/lispops.h | 2 ++ 3 files changed, 22 insertions(+) diff --git a/src/init.c b/src/init.c index a5c3c40..237cc03 100644 --- a/src/init.c +++ b/src/init.c @@ -36,6 +36,11 @@ int main (int argc, char *argv[]) { fprintf( stderr, "Post scarcity software environment version %s\n", VERSION); initialise_cons_pages(); + /* privileged variables (keywords) */ + deep_bind( intern( c_string_to_lisp_string( "nil"), oblist), NIL); + deep_bind( intern( c_string_to_lisp_string( "t"), oblist), TRUE); + + /* primitive function operations */ bind_function( "assoc", &lisp_assoc); bind_function( "car", &lisp_car); bind_function( "cdr", &lisp_cdr); @@ -45,8 +50,10 @@ int main (int argc, char *argv[]) { bind_function( "read", &lisp_read); bind_function( "print", &lisp_print); + /* primitive special forms */ bind_special( "apply", &lisp_apply); bind_special( "eval", &lisp_eval); + bind_special( "quote", &lisp_quote); fprintf( stderr, "\n:: "); struct cons_pointer input = read( stdin); diff --git a/src/lispops.c b/src/lispops.c index 6dd4d88..0399b21 100644 --- a/src/lispops.c +++ b/src/lispops.c @@ -117,6 +117,7 @@ struct cons_pointer lisp_eval( struct cons_pointer s_expr, struct cons_pointer e struct cons_space_object special = pointer2cell( fn_pointer); result = (*special.payload.special.executable)( args, env, previous); } else if ( functionp( fn_pointer)) { + /* actually, this is apply */ struct cons_space_object function = pointer2cell( fn_pointer); struct stack_frame* frame = make_stack_frame( my_frame, args, env); @@ -147,6 +148,18 @@ struct cons_pointer lisp_eval( struct cons_pointer s_expr, struct cons_pointer e return result; } +/** + * (quote a) + * + * Special form + * Returns its argument (strictly first argument - only one is expected but + * this isn't at this stage checked) unevaluated. + */ +struct cons_pointer lisp_quote( struct cons_pointer args, struct cons_pointer env, + struct stack_frame* frame) { + return c_car( args); +} + /** * (cons a b) * diff --git a/src/lispops.h b/src/lispops.h index 1268b7e..597d67f 100644 --- a/src/lispops.h +++ b/src/lispops.h @@ -24,6 +24,8 @@ struct cons_pointer lisp_eval( struct cons_pointer args, struct cons_pointer env struct stack_frame* frame); struct cons_pointer lisp_apply( struct cons_pointer args, struct cons_pointer env, struct stack_frame* frame); +struct cons_pointer lisp_quote( struct cons_pointer args, struct cons_pointer env, + struct stack_frame* frame); /* functions */ struct cons_pointer lisp_cons( struct stack_frame* frame, struct cons_pointer env);