10.5 Continuation Marks (original) (raw)
10.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 continuationC that extends C0 is defined as follows:
- If C is an empty continuation, then the mark list isnull.
- 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 byk, then the mark list for C is the mark list forC0.
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 bycall-with-current-continuation orcall-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 whencall-with-current-continuation orcall-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 #f, the resulting set of continuation marks is empty. If cont is an escape continuation (see Prompts, Delimited Continuations, and Barriers), then the current continuation must extend cont, or theexn:fail:contract exception is raised. If cont was not captured with respect to prompt-tag and does not include a prompt forprompt-tag, the exn:fail:contract exception is raised. Ifcont 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-vin mark-set, which is a set of marks returned bycurrent-continuation-marks or #f as a shorthand for(current-continuation-marks prompt-tag). The result list is truncated at the first point, if any, where continuation frames were originally separated by a prompt tagged with prompt-tag. Producing the result takes time proportional to the size of the continuation reflected bymark-set.
Changed in version 8.0.0.1 of package base: Changed to allow mark-set as #f.
Returns a newly-created list containing vectors of marks inmark-set for the keys in key-list, up toprompt-tag, where a #f value for mark-setis equivalent to (current-continuation-marks 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 inkey-list. Values for multiple keys appear in a single vector only when the marks are for the same continuation frame inmark-set. The none-v argument is used for vector elements to indicate the lack of a value. Producing the result takes time proportional to the size of the continuation reflected bymark-set times the length of key-list.
Changed in version 8.0.0.1 of package base: Changed to allow mark-set as #f.
Like continuation-mark-set->list*, but instead of returning a list of values, returns a functional iterator in the form of a procedure that returns one element of the would-be list and a new iterator function for the rest of the would-be list. An iterator procedure returns #f instead of a vector when no more elements are available; in that case, the returned iterator procedure is like the called one, producing no further values. The time required for each step is proportional to the length ofkey-list times the size of the segment of the continuation reflected by mark-set between frames that have keys inkey-list.
Added in version 7.5.0.7 of package base.
Changed in version 8.0.0.1: Changed to allow mark-set as #f.
Returns the first element of the list that would be returned by(continuation-mark-set->list (or mark-set (current-continuation-marks prompt-tag)) key-v prompt-tag), ornone-v if the result would be the empty list.
The result is produced in (amortized) constant time. Typically, this result can be computed more quickly usingcontinuation-mark-set-first than usingcontinuation-mark-set->list or by usingcontinuation-mark-set->iterator and iterating just once.
Although #f and (current-continuation-marks prompt-tag) are equivalent for mark-set, providing #fas mark-set can enable shortcuts that make it even faster.
Calls proc with the value associated with key-v in the first frame of the current continuation (i.e., a value that would be replaced if the call tocall-with-immediate-continuation-mark were replaced with awith-continuation-mark form using key-v as the key expression). If no such value exists in the first frame,default-v is passed to proc. The proc is called in tail position with respect to thecall-with-immediate-continuation-mark call.
This function could be implemented with a combination ofwith-continuation-mark, current-continuation-marks, and continuation-mark-set->list*, as shown below, butcall-with-immediate-continuation-mark is implemented more efficiently; it inspects only the first frame of the current continuation.
Creates a continuation mark key that is not equal? to the result of any other value (including prior and future results frommake-continuation-mark-key). The continuation mark key can be used as the key argument for with-continuation-mark or accessor procedures like continuation-mark-set-first. The mark key can be chaperoned or impersonated, unlike other values that are used as the mark key.
The optional sym argument, if provided, is used when printing the continuation mark.
Returns #t if v is a mark key created bymake-continuation-mark-key, #f otherwise.
Returns #t if v is a mark set created bycontinuation-marks or current-continuation-marks,#f otherwise.
Returns a list representing an approximate “stack trace” for mark-set’s continuation. The list contains pairs if realms? is #f, where thecar 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 cdrare never both #f. If realms? is true, the list contains 3-element vectors, where the first two elements are like the values for a pair, and the third element is a realm symbol.
Conceptually, the stack-trace list is the result ofcontinuation-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 (seeerror-display-handler) for exceptions other thanexn:fail:user (see raise-user-error inRaising Exceptions).
Examples:
> (define (extract-current-continuation-marks key) (continuation-mark-set->list (current-continuation-marks) key)) '(mark) '((mark1) (mark2)) '(mark2) '((mark2 mark1)) '(1)
Changed in version 8.4.0.2 of package base: Added the realms? argument.