The macro stepper, by default, does not show the expansion of macros
defined in the mzscheme language or imported from other
libraries. For example, the macro stepper doesn’t show that
define
expands into define-values
, and it doesn’t
show that when
expands into if
and
begin
. Of course, it still shows the expansion of the
right-hand side of a definition and the condition and body expressions
of a when
expression.
You can customize the behavior of the macro stepper in this regard by disabling macro hiding entirely or by customizing the modules or individual macros it hides.
The macro hiding panel is hidden by default. Show it by selecting “Show/hide macro hiding configuration” from the “Stepper” menu. That will add the configuration panel to the bottom of the macro stepper frame.
The default policy enables macro hiding and hides all macros from the
mzscheme
language and all macros imported through
(require (lib ---))
and (require (planet ---))
.
You may change the policy by selecting an identifier in the syntax display and then clicking one of "Hide module", "Hide macro", or "Show macro" in the configuration panel. The new rule appears in the policy list. You may remove it by selecting it in the list and clicking the “Delete” button.
Disabling macro hiding makes the stepper show the expansion of all
macros. It also reveals additional details about macro expansion in
mzscheme
. With macro hiding disabled, the stepper will show
internal definition blocks being rewritten to letrec expressions,
begin forms being spliced into module or block bodies, and other such
steps.1
Changes to the checkboxes on the left-hand side of the panel are persistent: future sessions with the macro stepper will use the last options you saved by default. Rules about specific modules and macros are not persistent.
There are also limitations to the kinds of macros that the stepper can perform hiding on. The following kinds of macros cannot be hidden:
macros that duplicate their subexpressions
macros that use advanced features such as local-expand
,
syntax-local-lift-expression
, etc
contracts (because they use lifting)
When macro hiding is enabled and the macro stepper encounters one of those sorts of macros, it will emit a warning and try to continue to apply macro hiding to the unaffected part of the program. In some cases, it will emit an error and switch off macro hiding entirely.
Future releases of the macro stepper should eliminate some of these limitations.
1 Disabling macro hiding is a good way to learn about the
implementation of many mzscheme
syntactic forms and the way
that macro expansion really works.