9.5 Continuation Marks
See Continuation Frames and Marks and Prompts, Delimited Continuations, and Barriers for
general information about continuation marks.
The list of continuation marks for a key k and a continuation
C that extends C0 is defined as follows:
If C is an empty continuation, then the mark list is
null.
If C’s first frame contains a mark m for k,
then the mark list for C is (cons m lst),
where lst is the mark list for k in C0.
If C’s first frame does not contain a mark keyed by
k, then the mark list for C is the mark list for
C0.
The with-continuation-mark form installs a mark on the first
frame of the current continuation (see Continuation Marks: with-continuation-mark). Procedures
such as current-continuation-marks allow inspection of marks.
Whenever Racket creates an exception record for a primitive exception,
it fills the continuation-marks field with the value of
(current-continuation-marks), thus providing a snapshot of
the continuation marks at the time of the exception.
When a continuation procedure returned by
call-with-current-continuation or
call-with-composable-continuation is invoked, it restores the
captured continuation, and also restores the marks in the
continuation’s frames to the marks that were present when
call-with-current-continuation or
call-with-composable-continuation was invoked.
Returns an opaque value containing the set of continuation marks for
all keys in the continuation
cont (or the current
continuation of
cont if it is a thread) up to the prompt
tagged by
prompt-tag. If
cont is an escape
continuation (see
Prompts, Delimited Continuations, and Barriers), then the current
continuation must extend
cont, or the
exn:fail:contract exception is raised. If
cont was not captured with
respect to
prompt-tag and does not include a prompt for
prompt-tag, the
exn:fail:contract exception is raised. If
cont is a dead thread, the result is an empty set of
continuation marks.
Returns an opaque value containing the set of continuation marks for
all keys in the current continuation up to prompt-tag. In
other words, it produces the same value as
Returns a newly-created list containing the marks for
key-v
in
mark-set, which is a set of marks returned by
current-continuation-marks. The result list is truncated at
the first point, if any, where continuation frames were originally
separated by a prompt tagged with
prompt-tag..
Returns a newly-created list containing vectors of marks in
mark-set for the keys in key-list, up to
prompt-tag. The length of each vector in the result list is
the same as the length of key-list, and a value in a
particular vector position is the value for the corresponding key in
key-list. Values for multiple keys appear in a single vector
only when the marks are for the same continuation frame in
mark-set. The none-v argument is used for vector
elements to indicate the lack of a value.
This function could be implemented with a combination of
with-continuation-mark, current-continuation-marks,
and continuation-mark-set->list, but
call-with-immediate-continuation-mark is implemented more
efficiently; it inspects only the first frame of the current
continuation.
Returns a list representing an approximate “
stack trace” for
mark-set’s
continuation. The list contains pairs, where the
car of each
pair contains either
#f or a symbol for a procedure name, and
the
cdr of each pair contains either
#f or a
srcloc value for the procedure’s source location (see
Counting Positions, Lines, and Columns); the
car and
cdr are never both
#f.
Conceptually, the stack-trace list is the result of
continuation-mark-set->list with mark-set and
Racket’s private key for procedure-call marks. The implementation may
be different, however, and the results may merely approximate the
correct answer. Thus, while the result may contain useful hints to
humans about the context of an expression, it is not reliable enough
for programmatic use.
A stack trace is extracted from an exception and displayed by the
default error display handler (see
error-display-handler) for exceptions other than
exn:fail:user (see raise-user-error in
Raising Exceptions).
Examples: |
|
|
'(mark) |
|
'((mark1) (mark2)) |
|
'(mark2) |
|
'((mark2 mark1)) |
|
'(1) |