«前の日記(2005年12月04日) 最新 次の日記(2005年12月06日)» 編集

Matzにっき


2005年12月05日 [長年日記]

_ 低レベル

[ruby-dev:27399]で、 『ハッカーのたのしみ』が紹介されていたので、 いつか読もうと思っていたが、松江では入手できない。 一度だけ見かけたときに捕獲しておくべきだったな。

先週東京に行ったときにも見つからなかった。 が、東京オフィスに実物があったので眺めてみた。

なかなか良い本のようなので購入を決意して、Amazonで購入した。

しかし、実物を見たときからわかっていたことだがこの本はなかなか「低レベル」で、 読むのがつらい。「低レベル」といっても、デキが悪いわけでも、 初心者むけというわけでもなくて、要するに「マシンに近い」ということ。

どうも普段やってることが言語処理系なんてマシンから遠いところにいるせいか、 このような「低レベル系」が苦手だ。

実は先日来『Write Great Code』という本の監訳しているのだが、 これも低レベルで大変だった。良い本なのは確かなのだが、 私がお手伝いできたのは文字コードに関する部分がほんのわずかだけだった。 監訳料はお断りしないといけないかしら?

_ [Ruby] Why Ruby is an acceptable LISP

RubyがLispの良い点を継承しているので、 「受け入れられる」Lispになるかもしれないという話。 来月発行の「ハッカーズライフ」を先取りされたようなネタ。

具体的には

  • 簡潔な関数型言語である点
  • 実用的なマクロがある

点を取りあげている。前者についてはブロックによる簡潔な高階関数が紹介されている

Lisp:
;; Call 'fn' once for each natural number.
(defun each-natural-number (fn)
  (loop for n from 1 do (funcall fn n)))

  ;; Print 1, 2, 3...
  (each-natural-number
    (lambda (n) (format t "~D~%" n)))

Ruby:
def each_natural_number(fn)
  n = 0
  loop { fn.call(n += 1) }
end

each_natural_number(lambda {|n| puts n })

または
def each_natural_number
  n = 0
  loop { yield n += 1 }
end

each_natural_number {|n| puts n }

実用的なマクロについては、ブロックやリフレクション(たとえばRailsが使っているような)DSL的表現によって提供できると述べている。

しかし、案の定Lispファンから反論が来ていて

Ruby is not Lisp. A Lisp is a Lisp because it’s code is represented as its basic data structure.

RubyはLispじゃない。Lispはコードが基本的データ構造で表現されているからこそLispなんだ

だそうだ。ごもっとも。

しかし、あらかじめ予想したようなエントリがあった。

Power vs Popularity」では、 「確かにLispの方が強力だ(マクロあるし)。では、なぜRubyがはやって、Lispはマイナーなままなのか? また、人気とパワーのトレードはどのくらいが適切か?」について、自答している(作者はLispファン)。

で、結論は要するに「Rails」ということらしい。つまり、Lispにはなんでもできるパワーはもっているが、結局自分でLisp on Railsを作らなくちゃいけない。そんなことしたくないから、Rails(とそれを使うためにRuby)を選んでいるわけだ。

「どこまでできるか」という可能性よりも、「今できる」という現実の方が人気に直結するということらしい。言語屋としてはちょっとさみしい結論だな。


«前の日記(2005年12月04日) 最新 次の日記(2005年12月06日)» 編集