diff --git a/src/lisp/drawl.pla b/src/lisp/drawl.pla index 9c92a02..7998b26 100644 --- a/src/lisp/drawl.pla +++ b/src/lisp/drawl.pla @@ -98,10 +98,7 @@ def natv_prog(symptr, expr) prog_car = prog_expr=>car prog_expr = prog_expr=>cdr // Assume continuation if prog_car->type == CONS_TYPE - // - // List - check for (COND (...)) - // - if prog_car=>car == sym_cond // Inline cond() evaluation + if prog_car=>car == sym_cond // Inline COND(...) evaluation cond_expr = prog_car=>cdr while cond_expr if eval_expr(cond_expr=>car=>car) @@ -110,7 +107,7 @@ def natv_prog(symptr, expr) fin cond_expr = cond_expr=>cdr loop - elsif prog_car=>car == sym_if // Inline if() evaluation + elsif prog_car=>car == sym_if // Inline IF(...) evaluation cond_expr = prog_car=>cdr if eval_expr(cond_expr=>car) eval_expr(cond_expr=>cdr=>car) // Drop result @@ -120,20 +117,20 @@ def natv_prog(symptr, expr) else eval_expr(prog_car) // Drop result fin - //else - // - // Atom - skip, i.e. (GO ) destination - // + //else Atom - skip, i.e. GO() destination + fin + if prog_return // Check for RETURN() + expr = prog_return ^ NULL_HACK + prog_return = NULL + prog_expr = NULL fin loop - prog = prog_enter - expr = prog_return - prog_return = FALSE + prog = prog_enter return expr end def natv_return(symptr, expr) - prog_return = eval_expr(expr=>car) + prog_return = eval_expr(expr=>car) ^ NULL_HACK return NULL // This value will be dropped in natv_prog end @@ -147,7 +144,7 @@ def natv_go(symptr, expr) fin symptr = symptr=>cdr loop - puts("(GO ...) destination not found:"); print_expr(expr); putln + puts("GO destination not found:"); print_expr(expr); putln return NULL end diff --git a/src/lisp/s-expr.pla b/src/lisp/s-expr.pla index 85d828b..1e231ba 100644 --- a/src/lisp/s-expr.pla +++ b/src/lisp/s-expr.pla @@ -69,6 +69,7 @@ var float_free = NULL // // Symbol hash table // + const HASH_SIZE = 64 // Must be power of two! const HASH_MASK = HASH_SIZE-1 word hashtbl[HASH_SIZE] @@ -180,7 +181,6 @@ def collect_list(listhead, freehead)#2 while elemptr if elemptr->type & MARK_BIT elemptr->type = elemptr->type & MARK_MASK - //puts("Free: "); print_expr(elemptr); putln if prevptr prevptr=>link = elemptr=>link elemptr=>link = freehead @@ -653,7 +653,7 @@ export def new_assoc(symptr, valptr)#0 var pair, pairlist if symptr and (symptr->type & TYPE_MASK <> SYM_TYPE) - puts("Not a SYM in new_assoc\n") + puts("NEW ASSOC: Not a SYM\n") return fin pair = new_cons @@ -1284,6 +1284,10 @@ def natv_for(symptr, expr) return pop_sweep_stack end +def natv_copy(symptr, expr) + return copy_expr(expr=>car) +end + // // Install default functions // @@ -1326,5 +1330,6 @@ new_sym("PRINT")=>natv = @natv_print new_sym("EVAL")=>natv = @natv_eval new_sym("TRACE")=>natv = @natv_trace new_sym("FOR")=>natv = @natv_for +new_sym("COPY")=>natv = @natv_copy return modkeep | modinitkeep done