作者: 機械伯爵
日時: 2007/10/3(08:34)
 機械す。

> ジャアクな回答ですので使用禁止 :)

 ……一発目で、話がいきなりズレましたね(汗)

 私は、「変数を使ってもわかりやすい」から始まって、「どんなタイプの
プログラミングスタイルへ誘導したらよいか」という話題を振りたいための
スケッチ(NHK言語講座で言うならスキット)のつもりだったんですが……

 いや、わかっててやってるんでしょうけどね(泣)

> def f0(v): return v*2
> def f1(v): return v*3
> def f2(v): return v*4
> def f3(v): return v*5
> def f4(v): return v*6
> 
> print reduce(lambda v, f: f(v), [1, f0, f1, f2, f3, f4])

 一応、py3k版(+プチ改良)を。

from functools import reduce
ans = reduce(lambda v, f: f(v),(
  1,
  lambda v: v * 2,
  lambda v: v * 3,
  lambda v: v * 4,
  lambda v: v * 5,
  lambda v: v * 6))

print(ans)

 Pythonではdef文は関数定義、lambda式によって出来る関数は無名関数、と
言ってますが、λ式(値としてではない式自身)をオブジェクトとして記述
したいなら、実はlambda表記のほうが直感的じゃないか、と、このごろ思った
りします(一つの式しか表記できないので)

 逆にdef文は、戻り値も設定できる手続き(procedure)という雰囲気ですね。

> Ruby版
puts [
  proc{|v| v*2},
  proc{|v| v*3},
  proc{|v| v*4},
  proc{|v| v*5},
  proc{|v| v*6},
].inject(1){|r, f| r = f.call(r)}

(↑主に、私が理解するために、改行を入れさせていただきました)

 RubyはSmalltalkみたいにプロシージャブロックが作れますし、メソッド適用
もしやすいですから、Smalltalkっぽくコードを書くには、Rubyを使った方が
いいかもしれませんね(書いたコードの通り、PythonでSmalltalkスタイルは
無理ありすぎ……)

 逆にSchemeみたいな「全部オブジェクト」な言語にスイッチを考えるなら、
Pythonのほうがわかりやすいかも。

 /機械伯爵/