cc
¬
3.1Loop
8.18
top
← prev up next →

GotoπŸ”— i

(require goto ) package: goto

1OverviewπŸ”— i

This package provides label and goto constructs that simulate jump using call/cc .

2API ReferenceπŸ”— i

procedure

( goto k)none/c

Sets current continuation.

(define (goto k)(kk))

procedure

( label [prompt-tag])continuation?

Gets current continuation.

(call/cc goto prompt-tag))

procedure

( cc [prompt-tag])continuation?

(cc k)none/c
Is an alias for current-continuation .

type constructor

( ¬a)

(define-type(¬a)(aNothing))

type

Label

Is the fixed point of ¬.

(define-typeLabel(¬Label))

3ExamplesπŸ”— i

3.1LoopπŸ”— i

(let ([x0])
(define loop(label ))
(set! x(add1 x))
(when (< x7)(goto loop))
(displayln x))

3.2Yin-Yang PuzzleπŸ”— i

(display #\@)
(display #\*)
(knkn+1)))
(let* ([k#f][k0(label )])
(unless k(set! kk0)(goto k))
(display #\@)
(let* ([knk][kn+1(label )])
(when (eq? knk)(set! kkn+1)(goto k))
(display #\*)
(goto kn)))
(define (k0kn)
(display #\@)
(define (kn+1k)
(display #\*)
(knk))
(kn+1kn+1))
(k0k0)

3.3Call with Current ContinuationπŸ”— i

(define (call/cc proc)
(define (dispatcherk. v*)
(if k
(proc(curry k#f))
(apply values v*)))
(call-with-values cc dispatcher))
(define (call/cc proc)
(define v*#f)
(define l(label ))
(if v*
(proc(λ vs(set! v*vs)(goto l)))))

3.4Light-Weight ProcessπŸ”— i

(let ([lwp-queue(make-queue )])
(define (start)
(when (non-empty-queue? lwp-queue)
(goto (dequeue! lwp-queue))))
(define (lwp-enqueue!breakcontinue)
(define first?#t)
(define l(label ))
(case/eq first?
[(#t)
(set! first?#f)
(enqueue! lwp-queuel)
(break)]
[(#f)(continue)]))
(define (pause)(lwp-enqueue!startvoid ))
(define (lwpthk)(lwp-enqueue!void (λ ()(thk)(start))))
(lwp(λ ()(goto (begin0 (label )(pause)(display #\h)))))
(lwp(λ ()(goto (begin0 (label )(pause)(display #\e)))))
(lwp(λ ()(goto (begin0 (label )(pause)(display #\y)))))
(lwp(λ ()(goto (begin0 (label )(pause)(display #\!)))))
(lwp(λ ()(goto (begin0 (label )(pause)(newline )))))
(start))

3.5Ambiguous OperatorπŸ”— i

(let ([task*'()])
(define (fail)
(if (null? task*)
(error "Amb tree exhausted")
(goto (car task*))))
(define (amb*. alt*)
(define first?#t)
(define task(label ))
(when (null? alt*)(fail))
(when first?
(set! first?#f)
(set! task*(cons tasktask*)))
(define alt(car alt*))
(set! alt*(cdr alt*))
(when (null? alt*)
(set! task*(cdr task*)))
(when (eq? altamb*)
(goto task))
(alt))
(define-syntax-rule (ambexp*... )(amb*(λ ()exp*)... ))
(let ([w-1(amb"the""that""a")]
[w-2(amb"frog""elephant""thing")]
[w-3(amb"walked""treaded""grows")]
[w-4(amb"slowly""quickly")])
(define (joins?leftright)
(string-ref left(sub1 (string-length left)))
(string-ref right0)))
(unless (joins?w-1w-2)(amb))
(unless (joins?w-2w-3)(amb))
(unless (joins?w-3w-4)(amb))
(list w-1w-2w-3w-4)))
top
← prev up next →

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /