summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-10-28 05:04:23 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-10-28 05:04:23 -0700
commitd80d25d7bffd8e4dbf8a43870046bc256a12cd66 (patch)
tree16de75112d64de4a9715423e757614fd6b3f89d0 /share
parent58c1299e112e10bcb37ae888f3dbc6d3aa211eeb (diff)
downloadtxr-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.tl25
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))