Arcがとうとうリリースされた。
現時点ではMzSchemeで書かれたSchemeへのコンパイラとして実装されているようだ。 チュートリアルを見ると 「簡潔な表現を重視したLisp-1」という感じ。 ふーん、Lisp-2じゃないんだ。
興味深いのは「~」と「:」。
「~f」は「(fn (x) (not (f x)))」を意味する。 「f:g」は「(fn (x) (f (g x)))」を意味する。 これらはより関数型プログラミングを強く意識していることを意味してるんだと思う。
あと、「lambda → fn」とか「defmacro → mac」とかは まあ単なる短縮形って感じ。「setf → =」ってのはちょっと意外だったけど。
で、さっそく批判されている。 「ビッグネーム」が6年越しでほのめかしてきた言語だけに 期待が膨らんでいたぶん、失望も大きかったらしい。 まあ、彼ほど忙しい人が自分で開発したんだから、 あんまり進まないのは当然だと思うよ。
さて、いくつもある批判のうち最大のものは 「ASCIIの96文字しか扱わない」というもの。 とはいえ、フルUnicodeをサポートするのは大変だし、 「とりあえず」という意味ではそんなに悪い判断ではないと思うよ。 むしろ下手にUnicodeべったりな処理系にするよりは賢いかも。 変に実装すると今さら「1文字=16ビット」で実装しかねないから。アメリカ人は。 逆に「1文字=1バイト」にべったりしてもらっても困るわけだが。
私にとってもっと大きな欠点だと思えるのは、 オブジェクト指向機能あるいはgeneric functionが導入されていないこと。 まあ、Arcがオブジェクト指向言語でない理由はPaulがすでに述べているわけだが、言語の拡張性や柔軟性を考えるとgeneric functionは欲しかった。
あと、Lisp-1にCommonLisp的マクロシステムを導入しているような気がするんだけど、 これって安全に書けるんだっけ。よく知らないんだけど、 Schemeの人々がR5RSの時にマクロシステムでさんざん悩んだのはまさにそこにあった ような気がするんだけど。この辺は識者に聞いてみたいところ。
ここで説明もなくLisp-1とかLisp-2とか書いたが、 そういえば日本語であまりこの用語を見たことがないので補足しておく。
基本的に名前空間が一つしかないLispのことをLisp-1と呼ぶ。 たとえばSchemeがそう。関数の名前空間と変数の名前空間か分離していないので
(display "hello world") ;; (1) hello world (define p display) ;; (2) displayをpに代入 (p "hello world") ;; (3) 1行目と同じ動作
となる。一方、名前空間がひとつでないLispをLisp-2と呼ぶ 別に名前空間の数はふたつに限るわけではない。CommonLispでは7つと聞いたような気がする(本当?)
(print1 "hello world") ;; (1) hello world (setq p print1) ;; (2) undefined variable print1
CommonLispでは関数の名前空間と変数の名前空間が異なっているので、 上記の代入はエラーになる。
Lisp-1とLisp2の区別はLisp以外のプログラミング言語でも存在する。 たとえば、PythonやJavaScriptはLisp-1であり、 RubyはLisp-2である。
どっちが良いとかは難しいが、Lisp-1の方が関数型プログラミングを 統一的に書きやすいというメリットはある。 一方、伝統的なオブジェクト指向プログラミングモデルにはLisp-2の方が なじみやすいだろう。
「なめねこ」まで引っ張り出すとは。なんか私が前フリをかましたように見えるけど、 先日の「Webアプリケーションをなめるな」の元ネタは 「月をなめるな」ですからね*1。
ちなみにこの研修、うちの娘の参観日でも行われていた。 が、中学生たちはちゃんと月について理解してたようだ。 少なくとも「酸素ボンベは要らない」などとは言わなかった。
*1 正確には「はっきりと意識はしてなかったけど、あえて言えば」くらいだね
意外な展開。見守りたい。
これがどういう意味を持つのかは 内部事情を知らない私には断言するのは難しいけれど、 オープンソースをはじめとした技術(未来技術?)に価値を見いだす企業が増えており*1、 お金に余裕があれば会社を買うことでその技術を入手しようという行動が 少なくとも海外では目立っており、 この買収は国内でもその動きが出てきてい兆候なのだ、 とも読める。
そうなんだろうか。
*1 最近の例だとMySQL, Trolltechなど