Skip to content

Instantly share code, notes, and snippets.

@yamasushi
Created July 27, 2012 04:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yamasushi/3186143 to your computer and use it in GitHub Desktop.
Save yamasushi/3186143 to your computer and use it in GitHub Desktop.
イテレータ反転
; イテレータ反転
(define-module inverter
(use gauche.generator)
(use util.stream)
;
(use util.queue)
(use gauche.threads)
;
(export
generator-inverter
stream-inverter
mtgenerator-inverter
mtstream-inverter
)
)
(select-module inverter)
;イテレータを反転してgeneratorにする手続きを返す
; produce ..... yield手続きを引数にもつ手続き
; consume ..... ジェネレータを引数にもつ手続き
(define (generator-inverter)
(^[produce consume] (consume (generate produce) ) ) )
;イテレータを反転してstreamににする手続きを返す
; produce ..... yield手続きを引数にもつ手続き
; consume ..... ジェネレータを引数にもつ手続き
(define (stream-inverter)
(^[produce consume]
(consume (iterator->stream
(^[next end]
(produce (^x (if (eof-object? x) (end) (next x) ) ) ) )
) ) ) )
(define (mtqueue->generator mtq)
(generate (^[yield]
(let loop [(xc (dequeue/wait! mtq))]
(if (eof-object? xc)
(yield (eof-object))
(begin
(yield xc)
(loop (dequeue/wait! mtq) ) ) ) ) ) )
)
(define (mtqueue->stream mtq)
(iterator->stream (^[next end]
(let loop [(xc (dequeue/wait! mtq))]
(if (eof-object? xc)
(end)
(begin
(next xc)
(loop (dequeue/wait! mtq) ) ) ) ) ) )
)
;イテレータを反転してgeneratorなどににする手続き(スレッドを使用)
; mtquere->x ..... mtqueureからgeneratorなどにする手続き
; produce ..... yield手続きを引数にもつ手続き
; consume ..... ジェネレータを引数にもつ手続き
(define (mt-inverter mtqueue->x produce consume :key (queue-size 100))
(define (make-producer mtq)
(^ []
(guard (e [else
(print (standard-error-port) (ref e 'message) )
(enqueue/wait! mtq (eof-object)) ] )
(produce (cut enqueue/wait! mtq <>))
(enqueue/wait! mtq (eof-object))
) ) )
(define (make-consumer mtq)
(^ []
(guard (e [else (print (standard-error-port) (ref e 'message) ) ])
(consume (mtqueue->x mtq) ) ) ) )
(and-let* [ ( mtq (make-mtqueue :max-length queue-size))
( c (make-thread (make-consumer mtq ) ) )
( p (make-thread (make-producer mtq )))]
(let [(tc (thread-start! c))
(tp (thread-start! p)) ]
(thread-join! tp)
(thread-join! tc) ; <----consumerの値を返す
) ) )
;イテレータを反転してgeneratorにする手続きを返す(スレッドを使用)
; produce ..... yield手続きを引数にもつ手続き
; consume ..... ジェネレータを引数にもつ手続き
(define (mtgenerator-inverter :key (queue-size 100))
(^[produce consume]
(mt-inverter mtqueue->generator produce consume :queue-size queue-size) ) )
;イテレータを反転してstreamににする手続きを返す(スレッドを使用)
; produce ..... yield手続きを引数にもつ手続き
; consume ..... ジェネレータを引数にもつ手続き
(define (mtstream-inverter :key (queue-size 100))
(^[produce consume]
(mt-inverter mtqueue->stream produce consume :queue-size queue-size) ) )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment