step
evaluates a form and allows you to single-step through it. You can include a call to step inside a tricky definition to invoke the stepper every time the definition is used.
step
can also optionally step through macros.
The commands shown below are available. When certain stepper variables (as described below) are set, some of these commands are not relevant and are therefore not available. Use
:help
to get a list of the commands.
Step this form and all of its subforms (optional positive integer argument).
Step this form without stepping its subforms.
Step up out of this form without stepping its subforms.
Return a value to use for this form.
Quit from the current stepper level.
Redo one of the previous commands.
Get an item from the history list and put it in a variable.
List available commands.
Replace one form with another form in previous command and redo it.
List the commands history.
The optional integer argument
n
for
:s
means do
:s
n
times.
Note:
step
is a Listener-based form stepper. LispWorks also offers a graphical source-code Stepper tool. See the
Common LispWorks User Guide
for details of that.
The following examples illustrate some of these commands.
USER 12 > (step (+ 1 (* 2 3) 4))
(+ 1 (* 2 3) 4) -> :s
1 -> :s
1
(* 2 3) -> :su
6
4 -> :s
4
11
11
USER 13 > (defun foo (x y) (+ x y))
FOO
USER 14 > step (foo (+ 1 1) 2)
(FOO (+ 1 1) 2) -> :st
(+ 1 1) -> :s
1 -> :s
1
1 -> :s
1
2
2 -> :s
2
4
4
USER 15 > :redo (STEP (FOO # 2))
(FOO (+ 1 1) 2) -> :s
(+ 1 1) -> :s
1 -> :s
1
2
2 -> :s
2
(+ X Y) -> :s
X -> :s
2
Y -> :s
2
4
4
4
You can interact when an evaluated form returns, by setting the variable
*no-step-out*
to
nil
. The prompt changes as shown below:
USER 36 > step (cons 1 2)
(CONS 1 2) -> :s
1 -> :s
1 = 1 <- :sr 3
2 -> :s
2 = 2 <- :sr 4
(CONS 1 2) = (3 . 4) <- :s
(3 . 4)
To allow expansion of macros, set the variable
*step-macros*
to
t
.
To step through the function calls in compiled code, set the variable
hcl:*step-compiled*
to
t
.
If required, the stepper can print out the step level: set the variable
*print-step-level*
to
t
, as shown in this session:
USER 21 > (setq *print-step-level* t)
T
USER 22 > step (cons 1 2)
[1](cons 1 2) -> :s
[2] 1 -> :s 1
[2] 2 -> :s
2
(1 . 2)
(1 . 2)
It is not advisable to try to step certain compiled functions, such as
car
and
format
. The variable
hcl:*step-filter*
contains a list of functions which should not be stepped. If you get deep stack overflows inside the stepper, you may need to add a function name to
hcl:*step-filter*
.
By default, the stepper uses the same printing environment as the rest of LispWorks (the same settings of the
*print-...*
variables). To control the stepper printing environment independently, set the variable
hcl:*step-print-env*
to
t
.
The values of the variables
hcl:*step-print-...*
are then used instead of the variables
*print-...*
.