summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eval.c5
-rw-r--r--share/txr/stdlib/place.tl41
2 files changed, 25 insertions, 21 deletions
diff --git a/eval.c b/eval.c
index c15ef1c5..8b56cbda 100644
--- a/eval.c
+++ b/eval.c
@@ -3898,8 +3898,11 @@ static val do_expand(val form, val menv)
val args = rest(form_ex);
val args_ex = expand_forms(args, menv);
- if (form_ex == form && args_ex == args)
+ if (form_ex == form && args_ex == args) {
+ if (!lookup_fun(menv, sym) && !special_operator_p(sym))
+ eval_warn(last_form_expanded, lit("unbound function ~s"), sym, nao);
return form;
+ }
if (args_ex == args)
return form_ex;
diff --git a/share/txr/stdlib/place.tl b/share/txr/stdlib/place.tl
index b18fddbf..76ca95e2 100644
--- a/share/txr/stdlib/place.tl
+++ b/share/txr/stdlib/place.tl
@@ -88,6 +88,22 @@
(makunbound ',',place-expr))))
,*op-body))
+ (defun sys:pl-expand (unex-place env)
+ (while t
+ (let ((place unex-place))
+ (let ((pm-expander [*place-macro* (if (consp unex-place)
+ (car unex-place))]))
+ (when pm-expander
+ (sys:setq place (sys:set-macro-ancestor
+ [pm-expander unex-place]
+ unex-place))))
+ (sys:setq place (macroexpand-1 place env))
+ (when (or (eq place unex-place)
+ (null place)
+ (and (atom place) (not (symbolp place))))
+ (return place))
+ (sys:setq unex-place place))))
+
(defun place-form-p (unex-place env)
(let ((place (sys:pl-expand unex-place env)))
(or (bindable place)
@@ -146,22 +162,6 @@
^(let ,(zip syms (repeat '((gensym)))) ,*body))
(macro-time
- (defun sys:pl-expand (unex-place env)
- (while t
- (let ((place unex-place))
- (let ((pm-expander [*place-macro* (if (consp unex-place)
- (car unex-place))]))
- (when pm-expander
- (sys:setq place (sys:set-macro-ancestor
- [pm-expander unex-place]
- unex-place))))
- (sys:setq place (macroexpand-1 place env))
- (when (or (eq place unex-place)
- (null place)
- (and (atom place) (not (symbolp place))))
- (return place))
- (sys:setq unex-place place))))
-
(defun sys:cp-origin (to-tree from-form : circ-check)
(unless (memq to-tree circ-check)
(tree-case to-tree
@@ -885,10 +885,11 @@
,tmp-body)))
(call-update-expander pl-getter pl-setter place env
^(macrolet ((,tmp-place () ^(,',pl-getter)))
- ,(sys:expand
- ^(symacrolet ((,sym (,tmp-place)))
- ,*body)
- env))))
+ ,(ignwarn
+ (sys:expand
+ ^(symacrolet ((,sym (,tmp-place)))
+ ,*body)
+ env)))))
(remhash *place-update-expander* tmp-place))))
(defmacro placelet* (sym-place-pairs . body)