20 lines
562 B
Racket
20 lines
562 B
Racket
#lang typed/racket
|
|
|
|
(define stop-value (gensym))
|
|
|
|
(: an-alist : (All (A B) (Listof (Pair A B)) -> (Rec R (-> (values (-> (values A B)) (-> R))))))
|
|
(define (an-alist lst)
|
|
(lambda: ()
|
|
(if (null? lst) (raise stop-value)
|
|
(let ([first (car lst)]
|
|
[rest (cdr lst)])
|
|
(values
|
|
(lambda: () (values (car first) (cdr first)))
|
|
(lambda: () (an-alist rest)))))))
|
|
|
|
(define alist (an-alist (list (cons 1 2) (cons 3 4) (cons 5 6))))
|
|
|
|
(call-with-values alist values) ; this works
|
|
|
|
(call-with-values alist (λ (e a) a))
|