doc.txt

Tail

_Tail_
_tail_

This collection provides one file:

 _tail.ss_: special form for tail-context continuations

This library provides a syntax for capturing a continuation and binding it to a
variable that, when applied, evaluates its subexpression in tail position with
respect to its parent expression.

======================================================================

> (let-tail-continuation k body1 body2 ...)
> (let/tc k body1 body2 ...)

A syntax for capturing the current continuation and binding it to the variable
k. The variable is in scope for the evaluation of the body expressions. The
difference between _let/tc_ and _let/cc_ is that the argument to an
application of the continuation variable bound by _let/tc_ occurs in
tail position.

Continuations bound by _let/tc_ may only receive exactly one value.

> (push-begin e1 e2 ...)

A syntax for evaluating a sequence of expressions, like Scheme's
primitive BEGIN, but without preserving tail context. In particular,
the last expression of _push-begin_ is NOT in tail position with
respect to the containing expression.

The value of a _push-begin_ expression, like BEGIN, is the value of
the last expression in the sequence.

The expressions of a _push-begin_ may evaluate to multiple values (or
no values).

======================================================================

EXAMPLES -------------------------------------------------------------

(define (current-continuation-mark-list key-v)
  (continuation-mark-set->list (current-continuation-marks) key-v))

(define (countdown n)
  (with-continuation-mark 'countdown n
    (let/ec return
      (if (zero? n)
          (return (current-continuation-mark-list 'countdown))
          (return (countdown (sub1 n)))))))

> (countdown 10)
(0 1 2 3 4 5 6 7 8 9 10)

(define (countdown* n)
  (with-continuation-mark 'countdown n
    (let/tc return
      (if (zero? n)
          (return (current-continuation-mark-list 'countdown))
          (return (countdown* (sub1 n)))))))

> (countdown 10)
(0)