diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-25 21:04:50 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-25 21:04:50 -0700 |
commit | 40833b9787ab986908147a00ebf6561751bb8d74 (patch) | |
tree | 3027c7452d14f542f8857541791e5f80d86d02b3 /eval.c | |
parent | d4c9ac79a578f4fbbeef1a30d5b71e6ae17f4ca2 (diff) | |
download | txr-40833b9787ab986908147a00ebf6561751bb8d74.tar.gz txr-40833b9787ab986908147a00ebf6561751bb8d74.tar.bz2 txr-40833b9787ab986908147a00ebf6561751bb8d74.zip |
compiler: implement defsymacro special op.
* share/txr/stdlib/compiler.tl (compiler compile): Handle
defsymacro via expand-defsymacro expander.
(expand-defsymacro): New function.
* eval.c (rt_defsymacro): New static function.
(eval_init): register sys:rt-defsymacro intrinsic.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 9 |
1 files changed, 9 insertions, 0 deletions
@@ -1844,6 +1844,14 @@ static val op_defsymacro(val form, val env) return sym; } +static val rt_defsymacro(val sym, val def) +{ + remhash(top_vb, sym); + remhash(special, sym); + sethash(top_smb, sym, cons(sym, def)); + return sym; +} + static val op_defmacro(val form, val env); void trace_check(val name) @@ -6626,6 +6634,7 @@ void eval_init(void) reg_fun(intern(lit("rt-defvarl"), system_package), func_n1(rt_defvarl)); reg_fun(intern(lit("rt-defun"), system_package), func_n2(rt_defun)); reg_fun(intern(lit("rt-defmacro"), system_package), func_n3(rt_defmacro)); + reg_fun(intern(lit("rt-defsymacro"), system_package), func_n2(rt_defsymacro)); eval_error_s = intern(lit("eval-error"), user_package); uw_register_subtype(eval_error_s, error_s); |