(defun sb!xc:special-operator-p (symbol)
#!+sb-doc
- "If the symbol globally names a special form, returns T, otherwise NIL."
+ "If the symbol globally names a special form, return T, otherwise NIL."
(declare (symbol symbol))
(eq (info :function :kind symbol) :special-form))
whenever a runtime expansion is needed. Initially this is set to
FUNCALL.")
-(declaim (ftype (function (t &optional (or null sb!c::lexenv))) sb!xc:macroexpand-1))
(defun sb!xc:macroexpand-1 (form &optional env)
#!+sb-doc
- "If form is a macro (or symbol macro), expands it once. Returns two values,
+ "If form is a macro (or symbol macro), expand it once. Return two values,
the expanded form and a T-or-NIL flag indicating whether the form was, in
- fact, a macro. Env is the lexical environment to expand in, which defaults
+ fact, a macro. ENV is the lexical environment to expand in, which defaults
to the null environment."
(cond ((and (consp form) (symbolp (car form)))
(let ((def (sb!xc:macro-function (car form) env)))
((symbolp form)
(let* ((venv (when env (sb!c::lexenv-vars env)))
(local-def (cdr (assoc form venv))))
- (if (and (consp local-def)
- (eq (car local-def) 'macro))
- (values (cdr local-def) t)
- (values form nil))))
+ (cond ((and (consp local-def)
+ (eq (car local-def) 'macro))
+ (values (cdr local-def) t))
+ ((eq (info :variable :kind form) :macro)
+ (values (info :variable :macro-expansion form) t))
+ (t
+ (values form nil)))))
(t
(values form nil))))
-(declaim (ftype (function (t &optional (or null sb!c::lexenv))) sb!xc:macroexpand))
(defun sb!xc:macroexpand (form &optional env)
#!+sb-doc
"Repetitively call MACROEXPAND-1 until the form can no longer be expanded.