作者: 機械伯爵
日時: 2007/10/19(18:46)
 結構昔(2002年)にPaul Grahamが書いた、いろいろ問題のあった論文

『技術野郎の復讐---Revenge of the Nerds---』
 訳文:http://practical-scheme.net/trans/icad-j.html
 原文:http://www.paulgraham.com/icad.html
 現在は本にもなって、日本語訳もある……

 のネタの、

「私が言う言語の相対的な力を説明するために、次の問題を考えてみよう。
アキュムレータを生成する関数、すなわち、数nを取り、「数iを取って
nをiだけ増加させ、その増加した値を返す関数」を返すような関数だ。」

 の解答として、こんなのを考えてみた。

def incr(s, n):
  s[0] += n
  return s[0]

foo = lambda n: lambda i, s=[n]: incr(s, i)

 取る気の無い引数にデフォルト値を設定して一度だけ評価させるのは、
Pythonでクロージャを実装するときの歴史的なテクニックの一つだ。

 全体からみれば、明らかにPaulが書いた例である

def foo(n):
  s = [n]
  def bar(i):
    s[0] += i
    return s[0]
  return bar

 より、明らかに面倒だ。

 しかし、その後、コレを例にとられて、Pythonを欠陥言語扱い
されたわけなのだが、実を言えば、単に便利な関数が一つ無かった
だけの話だと落ち着く(下のラムダ式だけを取り出せば、面倒
だとはさすがにいえないだろう)

 Pythonにはヘンなクセは確かにたくさんあるが、致命的なクセ
はかなり少ない、と私は思う。

 まぁ、必要な関数は、これまた簡単なモジュールに纏めておけば
良いわけだし……

 ……これは単に、私がPython教の思想に毒されただけの話だろうか?

 /機械伯爵/