今日の自作関数

今日の自作関数は,趣向を換えてRubyでzipWith関数でも書いてみる.パフォーマンスなんぞ期待しない.


なんていうか,やっぱ長くなるよね.

def zipWith(x,y,&b)
  xs = x.dup
  ys = y.dup
  z = []
  aux = lambda{ |z,x,y|
    if (not x.empty?) && (not y.empty?)
      xh = x.shift
      yh = y.shift
      z.push(b.call(xh,yh))
      aux.call(z,x,y)
    end
  }
  aux.call(z,xs,ys)
  z
end

ちょっとでも使い易いように,zipWith関数にはリストを2つ,そんでブロックを与えるようにした.二引数関数のhogeを渡す,とかRubyでできないものね.この辺が関数型言語との違いか.んで,補助関数としてauxなんてのも作ったりして.
実際にirbで実行してみる.

irb(main):001:0> require 'zipwith.rb'
=> true
irb(main):002:0> a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
irb(main):003:0> b = [3,4,5,6,7]
=> [3, 4, 5, 6, 7]
irb(main):004:0> zipWith(a,b){|x,y| x + y}
=> [4, 6, 8, 10, 12]

よし,動いた.


余談だけど,irbを終了する時に,ついつい,うっかり:qとタイプしてしまいます.