Unixにはパイプといふものがある。プログラムには「標準入力」と「標準出力」といふものがあり、標準入力からなにかを受け取れば、それに基づいて標準出力になにかを表示することにする。その標準入力は、なにか別のプログラムの標準出力からやってくる。標準出力は、なにか別のプログラムの標準入力へゆく。かうしてプログラムを繋いでゆくことができる。
しかもイベント駆動である。実際には標準入力からはpull、標準出力へはpushなので、イベント駆動ではないが、標準入力からpullしやうとしてプログラムは、そこで停止し、標準入力がやってくれば (前のプログラムが標準出力へ書き出せば) 動き始める、といふ動作ができる。
このパイプを多次元にするのは難しい。実質的な成功例は無いとおもふ。 .on('〜', () => {}).on('〜', () => {})
とイベント駆動で書いてやれば、同等になるが、醜い。Unixシェルでは一時ファイルを作ってやって、行を分けてコマンドを書いてゆけば用を成すが、それはパイプではないし、醜い。
RubyではEnumeratorといふのがある。map (collect) やreduce (inject) をメソッドチェーンで書いてゆくものだ。これはパイプであり、便利だ。そしてEnumeratorは分岐できない。.each{|item| if 〜 then some(item); else other(item); end }
とeachの中で分岐を書くことに成る。
ここにegison-rubyといふものがある。その構文を真似れば、少しは分岐できさうな気がしてきた。
some_collection.case do with パターン do |e| e.each { } end with パターン do |e| e.each { } end else_ do |e| e.each { } end end
といふ構文だ。書いてみる。
https://gist.github.com/ne-sachirou/7b90e19fb3c8d9ada703
Lazy Enumeratorではきちんとlazyな動作をする。
構文しか真似てなくてEgisonには申し訳ない。そして醜い。たとへば分岐をまったく合流できない。
在りし日のCaty Scriptの文献を読みにゆかねばならない。