Fixed the horrendous 'unbound symbol nil' bug. Also work on documentation and
unit tests.
This commit is contained in:
parent
3659103dd7
commit
5e6363e6ae
17 changed files with 328 additions and 143 deletions
|
|
@ -36,7 +36,7 @@
|
|||
// #include "print.h"
|
||||
|
||||
/**
|
||||
* The global object list/or, to put it differently, the root namespace.
|
||||
* @brief The global object list/or, to put it differently, the root namespace.
|
||||
* What is added to this during system setup is 'global', that is,
|
||||
* visible to all sessions/threads. What is added during a session/thread is local to
|
||||
* that session/thread (because shallow binding). There must be some way for a user to
|
||||
|
|
@ -47,6 +47,12 @@
|
|||
*/
|
||||
struct cons_pointer oblist = NIL;
|
||||
|
||||
/**
|
||||
* @brief the symbol `NIL`, which is special!
|
||||
*
|
||||
*/
|
||||
struct cons_pointer privileged_symbol_nil = NIL;
|
||||
|
||||
/**
|
||||
* Return a hash value for the structure indicated by `ptr` such that if
|
||||
* `x`,`y` are two separate structures whose print representation is the same
|
||||
|
|
@ -163,7 +169,6 @@ struct cons_pointer hashmap_keys( struct cons_pointer mapp ) {
|
|||
!nilp( c ); c = c_cdr( c ) ) {
|
||||
result = make_cons( c_car( c_car( c ) ), result );
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -260,6 +265,8 @@ struct cons_pointer clone_hashmap( struct cons_pointer ptr ) {
|
|||
return result;
|
||||
}
|
||||
|
||||
// (keys set let quote read equal *out* *log* oblist cons source cond close meta mapcar negative? open subtract eval nλ *in* *sink* cdr set! reverse slurp try assoc eq add list time car t *prompt* absolute append apply divide exception get-hash hashmap inspect metadata multiply print put! put-all! read-char repl throw type + * - / = lambda λ nlambda progn)
|
||||
|
||||
/**
|
||||
* Implementation of interned? in C. The final implementation if interned? will
|
||||
* deal with stores which can be association lists or hashtables or hybrids of
|
||||
|
|
@ -294,6 +301,8 @@ internedp( struct cons_pointer key, struct cons_pointer store ) {
|
|||
// }
|
||||
if (!nilp( c_assoc( key, store))) {
|
||||
result = key;
|
||||
} else if ( equal( key, privileged_symbol_nil)) {
|
||||
result = privileged_symbol_nil;
|
||||
}
|
||||
} else {
|
||||
debug_print( L"`", DEBUG_BIND );
|
||||
|
|
|
|||
|
|
@ -20,6 +20,8 @@
|
|||
#ifndef __intern_h
|
||||
#define __intern_h
|
||||
|
||||
extern struct cons_pointer privileged_symbol_nil;
|
||||
|
||||
extern struct cons_pointer oblist;
|
||||
|
||||
uint32_t get_hash( struct cons_pointer ptr );
|
||||
|
|
|
|||
|
|
@ -1273,8 +1273,6 @@ struct cons_pointer lisp_repl( struct stack_frame *frame,
|
|||
struct cons_pointer old_oblist = oblist;
|
||||
struct cons_pointer new_env = env;
|
||||
|
||||
inc_ref( env );
|
||||
|
||||
if (truep(frame->arg[0])) {
|
||||
new_env = set( prompt_name, frame->arg[0], new_env);
|
||||
}
|
||||
|
|
@ -1338,7 +1336,6 @@ struct cons_pointer lisp_repl( struct stack_frame *frame,
|
|||
|
||||
expr = lisp_read( get_stack_frame( frame_pointer ), frame_pointer,
|
||||
new_env );
|
||||
inc_ref( expr );
|
||||
|
||||
if ( exceptionp( expr )
|
||||
&& url_feof( pointer2cell( input ).payload.stream.stream ) ) {
|
||||
|
|
@ -1356,7 +1353,7 @@ struct cons_pointer lisp_repl( struct stack_frame *frame,
|
|||
dec_ref( input );
|
||||
dec_ref( output );
|
||||
dec_ref( prompt_name );
|
||||
dec_ref( env );
|
||||
dec_ref( new_env);
|
||||
|
||||
debug_printf(DEBUG_REPL, L"Leaving inner repl\n");
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue