作者: 機械伯爵
日時: 2007/10/4(17:57)
 機械す。

> >  Rubyでもプロシージャブロックでなく名前付き関数だったら、私も手をいれて
> > ませんけど?(なんで上と下がちがうのかわかんなかったので、とりあえず)
> 
> それについては 2164で書いています。

 えっと、一応 Ruby で関数がファーストクラスオブジェクト扱いになって
ないのは知ってます。

※前にその話題で話した時、SchemeとCommon Lispでの関数の扱いの違いも知り、
 びっくりしました。

> 定義済みの関数/メソッドをこのような場所にワタシの期待するように置くには
> 
>   method(:f1),
>   method(:f2)
> 
> のようにする必要があるけれどもそれが思い出せなかったということです。

 私も「なんか方法はあったんだけどなぁ」……程度で思い出せなかったので、
かけなかったので、Python版を合わせてみたわけです。

 でも、よく考えたら、Rubyはメソッド適用のほうが、綺麗に書けるんじゃ
ありませんか?(たしか、カスケードみたいな書き方、ありますよね?)
 
> 最初の機械さんの例がfor ループやらで関数を連続して適用するという話
> だったのだから、必要がなければ無名関数(そこッ「匿名関数」とかゆわないッ)
> をこの例では使いませんよ。

 そーですね。じゃ、最終的には、こんな感じでしょっか?

from functools import reduce

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

def evalF(v, f):
  return f(v)

print(reduce(evalF, [f0, f1, f2, f3, f4], 1))

※括弧で囲めば、py3kでもPy2xでも通ります☆

ちなみに『闇』版は、こーなりまする

d = {'v':1}
for c in range(2, 7):
  exec('v *= %d' % c, d)

print(d['v'])

※『闇』=人を煙に巻くだけの目的の、わかりにくく、しかも効率の悪い
 『不道徳』なコード。教育書には間違っても『載せてはいけない』例。

> >  あと、こーいう可変である必要の無いものはタプルで、がセオリーなので
> > (メモリも少なくて済むし、アクセスも微妙に早い……まぁ、実際には何の
> > 違いも無いわけですが……)そのセオリーに従ったまでです。
> 
> ふむ。それはそれで筋が通ってますね。
> PEPか何かになってます?

 確か「Programming Python(『Python入門』か『Pythonプログラミング』)」に
載ってた、すげー古い情報ですけど。

 タプルって何に使うんだ、という実例で。

 ただ、イテレータもイテレートメソッドフックも無かった頃の話なので、
速度についてはかなり怪しいです(メモリが若干少ないのは、多分確実
ですが)

> ただし、舞台裏 :) でワタシが考えていたのは、動的にリストを組み立てて
> (内包表記を使ってもいいですけど)実行するというイメージだったので、
> immutableなタプルではなく、リストを使いました。

 Pythonの可変/不変オブジェクトのイメージ(使いどころ)って、わかり
づらいですよね。
 私は、タプルは、主に文法の中に溶け込んで使うイメージを持ってます。
 有名なスタックを実装するイディオムで、

stack = item, stack # push stack
item, stack = stack # pop stack

 ってのがありますよね。
 こういった使い捨てのシーケンスを作る時に、私はタプルをよく使ってます。

> ぺたり
> オブジェクト指向を高校の必修科目に?:高安厚思の "メタ脳 "を鍛えよう:ITpro
> http://itpro.nikkeibp.co.jp/article/Watcher/20071001/283412/

 ソフトウェアのアーキテクチャーに共通点や相違点を見出す設計法はもちろん有効
だけど、歴史にソレを当てはめるのは、正直どうかと思う。

※ききかじりの こーぞーしゅぎ ⇒ だつこーちくぅ

 /機械伯爵/うなれマシン頭脳(電子頭脳ですらない、歯車式)/