1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-04-09 16:40:38 +00:00

Fix RETURN (NULL) handling in PROG()

This commit is contained in:
David Schmenk 2024-07-28 09:16:02 -07:00
parent 320bfbef81
commit 485aba5542
2 changed files with 18 additions and 16 deletions

View File

@ -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

View File

@ -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