via Erlangの強さ

最近(でもないか・・・)Erlangが話題になっていて、趣味プログラマーになったとはいえ、ちょっと触ってみたいなあと思いつつ、時間ないなあと思いつつ。

んで話題のErlangのプロセスなんだけど、microthreadだろうなあ、と思っていたけどそれであってるっぽい。あんま詳しくないんでアレですが。詳しくは コチラ

Erlangのプロセスについてはmethaneさんがおっしゃてる通りだと思う。要はこれを使いやすい形で言語仕様にとりこんでるあたりがErlangの良さなんだよなあ。

たとえばPythonでもyieldがあるのでmicrothreadは可能で(Stackless Pythonまである)、Erlangのプロセスっぽいこともやろうと思えば可能じゃないか、って感じなんだけどあくまでやればできる、って感じだと思う。

というわけでmicrothreadを用いたプログラミングに対するある意味DSL的な言語ではないのかなあ、というのが今のところの印象。パッと見た感じその他は魅力的な部分があまり見当たらなかった。かといって機能が足りてないわけでもぜんぜんないので、microthreadや分散のメリットが前面にでるならガンガンつかってもいいと思ってたりするのです。


ネットをただよってたらこんなの見つけた。古いのに突っ込んで申し訳ない。

sorted関数とreversed関数

元のリストに副作用を起こさずに得ようと思ったら、 [x for x in reversed(l)] か、・・・

これPython結構やってても知らない人が多い気がする。というかなかなか必要にならない気がする。

lst = [1,2,3,4,5]
reversed(lst)
# => <listreverseiterator object at 0x00B90630>
lst[::-1]
#=> [5, 4, 3, 2, 1]

リストを非破壊的に逆順にするときってreversed使うんだけど、返ってくるのはイテレータ。

んじゃリストを得るときは、ってなるんだけど lst[::-1] ってする方法があったりする。リストスライスの3つめの値って忘れ去られがちな気がする・・・。


週末に引越し、ということで本なんかを送ってしまいました。

読む本が無いので、前から手を出そうと思っていたOCamlに手を出してみました。

導入

とりあえずDebianにaptで放り込む。

libcamomile-ocaml-data                          install
libcamomile-ocaml-dev                           install
libequeue-ocaml                                 install
libequeue-ocaml-dev                             install
libextlib-ocaml-dev                             install
libfileutils-ocaml-dev                          install
libocamlnet-ocaml                               install
libocamlnet-ocaml-dev                           install
libpcre-ocaml                                   install
libpcre-ocaml-dev                               install
ocaml                                           install
ocaml-base                                      install
ocaml-base-nox                                  install
ocaml-findlib                                   install
ocaml-interp                                    install
ocaml-nox                                       install

こんな感じ。どうやらfindlibというライブラリが重要らしい。パッケージ管理系のライブラリなんですけど。

んでテンプレ的なのはこんな感じにしてみた。

#use "topfind"
#camlp4o
#require "camlp4.extend"
#require "extlib"
#require "camomile"

open ExtLib

練習

超特急: 一時間でわかるML超入門 を見てから、 Objective Caml 入門 を読みながら、書いてみた。

普通に書きやすい。練習問題は・・・。なんていうか、SICP。普通に関数型言語として使うところまでやってみた。

日本語

EUCとUTFは大丈夫っぽい。ここらへんはCamomileというモジュールを使うらしい。とりあえず

module Encoding = CamomileLibrary.Default.Camomile.CharEncoding
module Enc = Encoding.Make (CamomileLibrary.UTF8)
let unicode s = Enc.decode (Encoding.of_name "jauto") s;;
let decode t n = Enc.encode (Encoding.of_name n) t;;

などとPythonみたいな関数を定義してみた。 jauto でエンコーディングは自動的に判別してくれるらしい。コードをEUCで書いてUTF-8のコンソールに出力してみる。うんうん、ちゃんと日本語いけてる。ただ、UTF-8で書いたファイルで unicode "ああああ" ってしたら当然 "ああああ" のままだと思うんだけど、ダメだった。なんでなんだろう。詳しい人いたら教えて欲しいです。

今までの感想

結構いい。モジュールシステムなんかはきっちりしてんなー、と思いました。オブジェクトシステムなんかが特徴だと思うんだけど、まだ触ってないんですよねえ。てゆーか詳しく解説しているところがすくないんで、どーしようかなあ。

あと、インタプリタの #require "camomile" みたいなのって、ネイティブコンパイラだとエラーになるんだけどこういうもんなんだろうか。つまりどっちか選びなさい、ってことでいいのかなあ・・・。ネイティブコンパイラでは無視してくれると一番ありがたいような気がするけど・・・