diff --git a/contrib/micros-macrostep.lisp b/contrib/micros-macrostep.lisp index d97900e..326e796 100644 --- a/contrib/micros-macrostep.lisp +++ b/contrib/micros-macrostep.lisp @@ -24,31 +24,34 @@ (defslimefun macrostep-expand-1 (string compiler-macros? context) (with-buffer-syntax () (let ((form (read-from-string string))) - (multiple-value-bind (expansion error-message) - (expand-form-once form compiler-macros? context) - (if error-message - `(:error ,error-message) - (multiple-value-bind (macros compiler-macros) - (collect-macro-forms-in-context expansion context) - (let* ((all-macros (append macros compiler-macros)) - (pretty-expansion (pprint-to-string expansion)) - (positions (collect-form-positions expansion - pretty-expansion - all-macros)) - (subform-info - (loop - for form in all-macros - for (start end) in positions - when (and start end) - collect (let ((op-name (to-string (first form))) - (op-type - (if (member form macros) - :macro - :compiler-macro))) - (list op-name - op-type - start))))) - `(:ok ,pretty-expansion ,subform-info)))))))) + (handler-case + (multiple-value-bind (expansion error-message) + (expand-form-once form compiler-macros? context) + (if error-message + `(:error ,error-message) + (multiple-value-bind (macros compiler-macros) + (collect-macro-forms-in-context expansion context) + (let* ((all-macros (append macros compiler-macros)) + (pretty-expansion (pprint-to-string expansion)) + (positions (collect-form-positions expansion + pretty-expansion + all-macros)) + (subform-info + (loop + for form in all-macros + for (start end) in positions + when (and start end) + collect (let ((op-name (to-string (first form))) + (op-type + (if (member form macros) + :macro + :compiler-macro))) + (list op-name + op-type + start))))) + `(:ok ,pretty-expansion ,subform-info))))) + (error (condition) + `(:error ,(princ-to-string condition))))))) (defun expand-form-once (form compiler-macros? context) (multiple-value-bind (expansion expanded?)