#:g1: channelの紹介

Posted 2014-07-07 19:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の189日目です。

channelとはなにか

 channelは、Moritz Heidkamp氏作のLamina for ClojureのChannelsのChicken版です。

パッケージ情報

パッケージ名channel
Chicken eggs:channel - The Chicken Scheme wiki

インストール方法

$ sudo chicken-install channel

すれば、

(use channel)

(require-extension channel)

試してみる

 Channelとはコールバック付きキューとのことです。
Lamina for ClojureというClojureのイベント駆動プログラミングのライブラリがあるようなのですが、それをChickenに持ってきたとのことで、大体似たようなことができるようです。

(define numbers (make-channel 1 2 3 4))

(channel-receive numbers) ;=> 1

;;; 関数を3つ適用 (channel-receive numbers print print print) ;>> 2 ;>> 2 ;>> 2 ;=> #t

;;; numbers channelに関数を付ける (on-channel-receive numbers (lambda (n) (print "got: " n))) ;>> got: 3 ;>> got: 4

;;; on-channel-receiveで関数を付けると、何かする度に関数が実行される (channel-enqueue numbers 5 6 7 8) ;>> got: 5 ;>> got: 6 ;>> got: 7 ;>> got: 8 ;=> #t

(define numbers (make-channel 1 2 3 4))

;;; フィルターを掛けたりもできる (define odd-numbers (filter-channel (map-channel numbers values) odd?))

(channel-receive odd-numbers) ;=> 1 (channel-receive odd-numbers) ;=> 3

まとめ

 今回は、channelを紹介してみました。
空になったchannelからreceiveしようとするとdeadlockとなって処理系が固まってしまうことがあるので、その辺りは注意が必要かもしれません。

comments powered by Disqus