diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-10-28 05:04:23 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-10-28 05:04:23 -0700 |
commit | d80d25d7bffd8e4dbf8a43870046bc256a12cd66 (patch) | |
tree | 16de75112d64de4a9715423e757614fd6b3f89d0 /share | |
parent | 58c1299e112e10bcb37ae888f3dbc6d3aa211eeb (diff) | |
download | txr-d80d25d7bffd8e4dbf8a43870046bc256a12cd66.tar.gz txr-d80d25d7bffd8e4dbf8a43870046bc256a12cd66.tar.bz2 txr-d80d25d7bffd8e4dbf8a43870046bc256a12cd66.zip |
Improvement in place macros.
Expansion of places now gives priority to place macros.
Moreover, it iterates over place macro and ordinary macro
expansion.
* share/txr/stdlib/place.tl (sys:trigger-load): Removed.
(sys:pl-expand): Rewritten.
* txr.1: Documented.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/place.tl | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/share/txr/stdlib/place.tl b/share/txr/stdlib/place.tl index b1452225..c60348e6 100644 --- a/share/txr/stdlib/place.tl +++ b/share/txr/stdlib/place.tl @@ -126,17 +126,22 @@ ^(let ,(zip syms (repeat '((gensym)))) ,*body)) (macro-time - (defun sys:trigger-load (form) - (when (consp form) (symbol-function (car form))) - form) - (defun sys:pl-expand (unex-place env) - (let ((ex-place (sys:expand unex-place env))) - (sys:trigger-load - (iflet ((pm-expander [*place-macro* (and (consp ex-place) - (car ex-place))])) - [pm-expander ex-place] - ex-place)))) + (while t + (let ((place unex-place)) + (let ((pm-expander [*place-macro* (if (consp unex-place) + (car unex-place))])) + (when pm-expander + (sys:setq place [pm-expander unex-place]))) + (sys:setq place (macroexpand place env)) + (when (or (eq place unex-place) + (null place) + (and (atom place) (not (symbolp place))) + (and (consp place) + (consp unex-place) + (eq (car place) (car unex-place)))) + (return place)) + (sys:setq unex-place place)))) (defun call-update-expander (getter setter unex-place env body) (let* ((place (sys:pl-expand unex-place env)) |