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 /share | |
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 'share')
-rw-r--r-- | share/txr/stdlib/compiler.tl | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl index 48a9f22d..f2614f77 100644 --- a/share/txr/stdlib/compiler.tl +++ b/share/txr/stdlib/compiler.tl @@ -198,6 +198,7 @@ (defvarl me.(compile oreg env (expand-defvarl form))) (defun me.(compile oreg env (expand-defun form))) (defmacro me.(compile oreg env (expand-defmacro form))) + (defsymacro me.(compile oreg env (expand-defsymacro form))) (sys:upenv me.(compile oreg env.up (cadr form))) (sys:dvbind me.(compile oreg env (caddr form))) (sys:with-dyn-rebinds me.(comp-progn oreg env (cddr form))) @@ -1111,6 +1112,10 @@ (sys:rt-defmacro ',name '(macro ,name) ,exp-lam) ',name))))) +(defun expand-defsymacro (form) + (mac-param-bind form (op name def) form + ^(sys:rt-defsymacro ',name ',def))) + (defun sys:bind-mac-error (ctx-form params obj too-few-p) (if (atom obj) (compile-error ctx-form "extra atom ~s not matched by params ~s" |