diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-25 10:32:16 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-25 10:32:16 -0700 |
commit | 089fd8fefbc3112378317bec13dbd524a80d0ac7 (patch) | |
tree | c7adacca08298fd9eed276f8861019c08acd7e87 | |
parent | b88d20ca237d734c0ff4cbf4a612b4bca63ed78c (diff) | |
download | txr-089fd8fefbc3112378317bec13dbd524a80d0ac7.tar.gz txr-089fd8fefbc3112378317bec13dbd524a80d0ac7.tar.bz2 txr-089fd8fefbc3112378317bec13dbd524a80d0ac7.zip |
eval/compiler: run-time support for compact defvarl.
* eval.c (rt_defvarl): New static function.
(op_defvarl): Simplified using rt_defvarl.
(eval_init): Register sys:rt-defvarl.
-rw-r--r-- | eval.c | 25 |
1 files changed, 20 insertions, 5 deletions
@@ -1801,17 +1801,30 @@ static val op_or(val form, val env) return nil; } +static val rt_defvarl(val sym) +{ + val new_p; + val cell = gethash_c(top_vb, sym, mkcloc(new_p)); + + if (new_p) { + uw_purge_deferred_warning(cons(var_s, sym)); + uw_purge_deferred_warning(cons(sym_s, sym)); + remhash(top_smb, sym); + return cell; + } + + return nil; +} + static val op_defvarl(val form, val env) { val args = rest(form); val sym = first(args); + val cell = rt_defvarl(sym); - if (!gethash(top_vb, sym)) { + if (cell) { val value = eval(second(args), env, form); - remhash(top_smb, sym); - sethash(top_vb, sym, cons(sym, value)); - uw_purge_deferred_warning(cons(var_s, sym)); - uw_purge_deferred_warning(cons(sym_s, sym)); + rplacd(cell, cons(sym, value)); } return sym; @@ -6601,6 +6614,8 @@ void eval_init(void) reg_fun(intern(lit("cptr-type"), user_package), func_n1(cptr_type)); reg_varl(intern(lit("cptr-null"), user_package), cptr(0)); + reg_fun(intern(lit("rt-defvarl"), system_package), func_n1(rt_defvarl)); + eval_error_s = intern(lit("eval-error"), user_package); uw_register_subtype(eval_error_s, error_s); |