lambdaってなんだ?
友人に,「lambdaて何やねん」と云われ,「知らんがな」と返す日々におさらばすべく,今日はlambdaを学びたいと思います.少しだけ.
入門
まず,http://www5a.biglobe.ne.jp/~sasagawa/MLEdit/Scheme/scheme4.htmlの下の方の関数を,rubyでやってみたかんじ.
fact = lambda{|n| if n == 0 puts n else print "#{n} " fact.call(n-1) end } fact.call(15)
なんだか,再帰やってるって感じはする.実行結果です.
$ ruby lambda_test1.rb 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
これで,for文が無くても繰り返し処理が行えるぜ.
まだまだ入門
次は簡単なフィボナッチ.
fib = lambda{|x,y,f| z = x + y print "#{z} " if f > 1 fib.call(y,z,f-1) end } fib.call(0,1,15) puts
うん,結局,Proc.newと同じように使っちゃった.ちなみに,実行結果です.
$ ruby lambda_test2.rb 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
eachのまねごと
forやwhileを使わないと言えば,each.そこで,eachとな似ても似つかないけど,配列の全ての要素に対して,何か行うようなlambdaを.
arr = [1,2,3,4,5,6,7] each = lambda{ |a,k| print "#{a[k]} " # ここに,各要素に対する処理を書く if k < a.size each.call(a,k+1) end } each.call(arr,0) puts $ ruby lambda_test3.rb 1 2 3 4 5 6 7
なんか,こんな事をすると,オブジェクト指向じゃないなぁ.
結果的に思った事
何と言うか,わざわざlambdaやprocを使わないで関数定義したほうが早いんじゃ・・・,そこで早さを比較してみた.比較するのは,コレと.
arr = [1,2,3,4,5,6,7] def each(a,k) print "#{a[k]} " if k < a.size each(a,k+1) end end each(arr,0) puts $ ruby lambda_ex.rb 1 2 3 4 5 6 7
それでは,レッツ比較・・・してみたけど,とても面白くない結果だったので詳細は割愛しますが,結果的にはほっとんど同じでした.まだ利点が分かんないよlambdaとproc.まぁやってる事(アルゴリズムにしても)がしょぼいからなぁ.まだまだ,lambdaも勉強が必要です.