2007-01-18

_ 自由に関する書籍

akrさんが自由や経済に関する知識に関心を持っておられる のですが、 自由という言葉の定義から始まって、 自由の捉え方は幅が広いので、 これだけ読めば十分という書籍はないと思います。 それだけだとあんまりなので、 とりあえず現在共通の議論の土台として用いられている古典から試してみてはいかがでしょうか。

自由論

自由を論ずるとき、もっとも重要な古典はミルの「On Liberty」(自由論)でしょう。 幸い 光文社から新訳が出版された ばかりですので、 入手は容易ですし、値段も手頃です。 ミルの視点に同意するか否かは別として、決して読んで損はしない名著であると思います。(ただし、念のため言っておくと、私自身はこの新訳を読んだことはありません。)

経済の方は、何を薦めていいのか私にはよく分かりません。 歴史が長い上に、みんな言っていることがてんでばらばら、 拠って立つ基盤にも違いがありすぎて、 闇雲につつき回すしか術はないのかもしれません。 私自身勉強不足ですし、もっと詳しい方に助言を頂く方が好ましいかと。

_ Lispは強力なのに不人気

Lispが大衆受けしない理由は、その表記法の非人間性、あるいは、 慣習との齟齬に尽きると感じています。 プログラミングにおいては、 大なり小なり、人間がコンピュータに歩み寄ってあげる必要がありますが、 その程度が大き過ぎるのが問題です。

  • 括弧がいばり過ぎ。算数や自然言語などの学習において、括弧はあくまで補助的役割を果たすものだという思考法が染み着いています。にもかかわらず、Lispでは括弧に大きな意味があるため、思考のギャップが生じます。
  • 括弧がうざい。人間は多くの場面で結合の優先順位によって楽をすることを知ってます。Lispはその辺をさっぱりよしなに扱ってくれないので、優しくありません。
  • よくある表現が分かりにくい。言語の構成要素がプリミティブ過ぎて、よくある道具が言語機能になっていないから、ぱっと見で理解できるような書き方をするのに苦労します。インデントの付け方で工夫できるとは言え、やっぱり辛いです。

もちろん、そんなのは人それぞれだろうという批判を予期した上で書きますが、 最後の点を具体例をあげて説明すると、

(if (= x 0)
  y
  (if (> 1 y)
    (+ x 1)
    (+ x y)))

みたいなのが私にはすぐには理解できません。 私にとって、elseな部分はifと並列なんですが、 そのように表記するのが難しいのです。 例えば、

if x == 0
  y
elsif 1 > y
  x + 1
else
  x + y
end

は、私にとって、百倍分かりやすいのです。

それならcondを使えばいいと言われると思うし、 確かにそれはそうなのですが、 条件分岐を行うのに、私は「〜だったらこうして、じゃなくて〜だったらああして...」と考えます。 そこにcondという、「いろいろ条件があるから、まずこいつらをひとまとめにして」という「変なもの」が登場するのは苦しいのです。

逆に言えば、表記が辛くないLispがあれば、喜んで使うような気がします。

ところで、動的言語に静的情報を追加すると言えば、 Python 3000でそういう機能が追加されるそうです。 CPythonではdesign by contract的意味合いが強くなりそうですが、 PyPy では最適化に利用できる可能性がなくもないかなと思います。 本当に使えるかどうかは分からないんですけど。

本日のツッコミ(全4件) [ツッコミを入れる]
_ shiro (2007-01-23 05:39)

これは解決の無い問題だと思うので、別の感覚の紹介と思って下さい。 <br> <br>私的には最初の例(else節の中にif)と次の例 (elsifでつないでく) は頭の中にある構造が別なので、書く上でも別に書ける方が嬉しいです。頭の中では前者が複数の階層を持つ二分木で、後者が一箇所の節から3つ以上の枝に分かれているイメージです。Lispで書くときは前者にifを、後者にcondを使います。他の言語でも、後者のケースでは可能な限り「ifではない」構文 (e.g. case) を使います。 <br> <br>ifが式でなく値を返せない言語の場合、if節の中に副作用式が入ってしまう (感覚的には「木構造の末端が重くなる」) ために、複数階層を持つ木をなんとなく書きにくいと思ってしまいます。したがって頭の中では複数階層であっても、フラットに変換して後者のように書くことはありますが、不自然に感じます。 <br> <br>この感覚はしかし、Lisp固有のものというよりは宣言的に書くか手順的に書くかという感覚の違いのようにも思えます。 <br>

_ okuji (2007-01-23 12:28)

木構造として捉えると、Lispのifが極めて自然な構文であるというのは全くその通りだと思います。しかし木構造というのは二次元なんですよね。(私のような)悪い脳味噌の持ち主がよりエネルギーを消耗する構造であることは間違いありません。 <br> <br>しかしそれ以上に気になるのが、連続性の問題ですね。例えば、最初に書き始めたときには二つの可能性しか思い浮かばなかったとします。すると、ifを使うのが自然だと思うんですね。タイプ量が微妙に少ないですし。その後に可能性が一つ増えたときに、どうするかなんですね。普通の人は単純にくっつけると思うんですよ。手順として、すでにシリアライズされてしまってますから。 <br> <br>それで、Lisperはこういう時に一々構造的に望ましくないという理由でcondに書き換えるのですか?少なくとも私の知る限りではそこまで律義なプログラマはあまりいないようです。Emacsとか、長い歴史を積み重ねているコードだと、極めて理解の困難なifの羅列が散見されたものでした(最近はどうなっているか知りません)。

_ shiro (2007-01-23 15:42)

あー私は律義に書き換えます。S式を切った貼ったするのはEmacsの得意技ですから、そんなに手間もかかりません。 <br> <br>ただ、確かにこのへんの感覚はLisper間でもばらつきがあるようです。Allegro Common Lispの作成者の中にも、condやifを嫌ってif*というマクロ (まさしく、if〜eisif〜elseでつないでゆく形式) を使ってる人がいます。 <br>http://www.franz.com/support/documentation/8.0/doc/operators/excl/if_s.htm <br>

_ kiyoka (2007-01-23 23:46)

私もifをcondに書き換えます。上記のようなシチュエーションでは必ず書き換えますよ。 <br>shiroさんのいわれるように、手間がかからないからだと思います。S式って結局のところ式なので断片を千切って貼ってを繰り返してもすぐに動くコードが再構成できるのがいいですね。 <br>

[]