diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-10-19 06:56:36 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-10-19 06:56:36 -0700 |
commit | 48ed73b524a4a61fe25d567744bc0bfdda50ebca (patch) | |
tree | 1abc670057c8b5d4a877b792066e43ddb940355c /share | |
parent | 3dee4bb2ff4bb18fa2eb4540b6c7d70d487d62af (diff) | |
download | txr-48ed73b524a4a61fe25d567744bc0bfdda50ebca.tar.gz txr-48ed73b524a4a61fe25d567744bc0bfdda50ebca.tar.bz2 txr-48ed73b524a4a61fe25d567744bc0bfdda50ebca.zip |
New variant of op: lop.
* lisplib.c (op_set_entries): Add lop to auto-load list.
* share/txr/stdlib/op.tl (sys:op-expand): Recognize lop
and implement its transformation.
(lop) New macro.
* txr.1: Documented.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/op.tl | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/share/txr/stdlib/op.tl b/share/txr/stdlib/op.tl index 78658658..e9ea8415 100644 --- a/share/txr/stdlib/op.tl +++ b/share/txr/stdlib/op.tl @@ -80,15 +80,26 @@ (syntax-0 (if (eq sym 'do) ^(,*args) ^[,*args])) (syntax-1 (sys:op-alpha-rename f e syntax-0 nil)) (syntax-2 (sys:op-alpha-rename f e syntax-1 t)) - (have-metas (slot ctx 'gens)) + (metas (slot ctx 'gens)) (rest-sym (sys:ensure-op-arg ctx 0))) - ^(lambda (,*(cdr (slot ctx 'gens)) . ,rest-sym) - ,(if (or have-metas (eq sym 'do)) - syntax-2 - (append syntax-2 rest-sym))))) + ^(lambda (,*(cdr metas) . ,rest-sym) + ,(let ((fargs (cdr (cdr syntax-2)))) + (cond + ((and (eq sym 'lop) fargs) + (let ((fargs-l1 (mapcar (lambda (farg) + ^(sys:l1-val ,farg)) + fargs))) + ^[sys:apply ,(car (cdr syntax-2)) + (append ,rest-sym (list ,*fargs-l1))])) + ((or metas (eq sym 'do)) + syntax-2) + (t (append syntax-2 rest-sym))))))) (defmacro op (:form f :env e . args) (sys:op-expand f e args)) (defmacro do (:form f :env e . args) (sys:op-expand f e args)) + +(defmacro lop (:form f :env e . args) + (sys:op-expand f e args)) |