ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Clojureコミュの雑談など

  • mixiチェック
  • このエントリーをはてなブックマークに追加

コメント(12)

はじめまして。

Clozure CLの日本語情報を検索してて"Clojure"と言う単語を発見。

「やだなあ。スペルミスちゃうの?」

とか思ったら、本当にそう言う名前のLisp方言だった、と言う経験をした亀田です(笑)。

個人的にはそのうち、Klosureと言う新Lisp方言を作ってやろう、と言う野望を持ってます(笑)。
よろしくお願いします。
Klosureいいですね!
どんな方向性のものなんですか?
気になるなあ。
Clozure CLというと、もしかしてMac使いの方ですか?
自分は個人用のPCをMacに乗り換えたばかりのMac初心者です。

自分はオレオレDBモデルに基づくオレオレDBMS開発に使う言語で
ErlangとCommon Lispで悩んでいたところ、
別件で調べていたScala経由でClojureを知りました
もう今はClojureで決まり!という感じです。
よろしくお願いします。
>どんな方向性のものなんですか?

いや、もう「名前だけ」です(笑)。
と言うか、みんな「クロージャー」好きですよね(笑)。

>Clozure CLというと、もしかしてMac使いの方ですか?

いや、Linuxです。
最近32bitLinuxでもClozure CLは使えるようになった、とか書いてたんですが、まだまだ、ですよね。
Cocoaとかのインターフェースが同梱されているんですけど、当然ながらLinuxでは動かない。
comp.lang.lispで「OpenStepで動かせるんじゃないか?」とか言う話も出てたんですが、試してません。設定がメンド臭そうですし(笑)。
Clozure CLってオープンソース系実装には珍しくゴージャスなIDEも付いているらしい、とマニュアルには記載されてるんですが、確かめる術が御座いません。

>自分は個人用のPCをMacに乗り換えたばかりのMac初心者です。

Macかなり良いらしいですね。僕は大昔に68040Mac(System7.1時代)は使ってたんですが、とんとご無沙汰です。
ポール・グレアムも今はMacですし、「実践Common Lisp」のPeter SeibelもMacらしいんで、今からはMacかなあ。
次回パソコン買う時考えます(笑)。2011年辺りに(笑)。

>もう今はClojureで決まり!という感じです。

ポール・グレアムのArcって全然下火になっちゃってますしね。ダークホースClojureがこれだけ注目株になるとは。ある種驚いています。
実はJVMで動くLisp方言に、SUNが音頭取ってた

newLisp:
http://www.newlisp.org/

ってのもあるんですが、これに関してもClozureの方が勢いがあるように見えます。
細かい違いは全然わかんないんですけどね(笑)。

よろしくお願いします。
>これに関してもClozureの方が勢いがあるように見えます。

だから「Clojure」ですよ(苦笑)。タイポタイポタイポ(笑)。
だから、紛らわしいんですってば(苦笑)。レキシカルスコープ大破壊(謎)。
Macの良さは外見やGUIのレンダリングがきれいで快適、
という以外にはまだよくわかっていないです。。。
Linuxの方が簡単に動くツールも多いし、
Macの知識もまだ少ないので
VMware上のUbuntuをMacのターミナル越しに使う
というほうがまだ多いです。

Clojureは、効率の良いイミュータブルなコンテナ+STM+遅延リスト
という選択が正しかったんでしょう、おそらく。
ミュータブルなものがあちこちにあると、スパゲッティコードになるって
いうのは的を得てると思います。
並行制御を抜きにしても、イミュータブルなデータ型の利点は
PythonやErlangでプログラミングしていて強く感じました。

Clozure,Clojureは確かに紛らわしいですね。
KlosureもJVM上だったらKlojureとか(笑)。
>Macの良さは外見やGUIのレンダリングがきれいで快適、
>という以外にはまだよくわかっていないです。。。

MatzLisp(笑)の作者のMatz氏はMac寄贈されたけど「使い辛い」とか書いてましたよね。
僕も、電器店で弄っただけ、なんですけど、端末とかどこにあるんだ、とか。ちょっと見つかり辛いトコロにあるな、と言う印象でした。Finderとかこんなんだっけ?とか思いながら触ってましたが(笑)。
でも、最近、Web見てると、Carbon Emacsの記事とかやたら多いんですよね(笑)。ゴージャスで(笑)。

>Linuxの方が簡単に動くツールも多い

そうですねえ。
確かに、それで言うと、ポール・グレアムなんかは元々変り種、なんですよね。FreeBSDの人ですし、Viユーザーですし。
FreeBSDって良く分かんない(FreeSBIEとかは触った事ありますが)んですが、その基準で言うと、LinuxよりOS Xの方が「近しい」のかな?多分。
Peter Seibelも元々「文筆業」なんで、それで言うといわゆる元「マカー」なんですよね(笑)。その辺抵抗ないのかも。

>Clojureは、効率の良いイミュータブルなコンテナ+STM+遅延リスト
>という選択が正しかったんでしょう、おそらく。

Clojureのサイト読んでて、「データ型が変わってる」って印象があったんですよね。Javaっぽい制限なんだか良く分からなくって。リストじゃないよ、シーケンスだよ、みたいな。
凄く「不思議な」印象だったんですよね(笑)。Pythonに近いのかな?
Erlangは全然分かりませんが(笑)。
OS XはBSD UNIXの子孫だとWikipediaにも書いてありますね。確かに。
自分の周りの開発者はおもにPython系になりますが、
Mac7割、Ubuntu2割強、Windows1割弱、という感じで
OS Xは多いです。

Pythonのイテレータに使用感覚はとても近いです。
http://en.wikipedia.org/wiki/Iterator#Python
ただPythonのイテレータは状態を持っていて、
イテレータから要素を取り出すのが破壊的な操作なんですが
Clojureではそうではなく、n番目やn番目以降というのも
簡単に取り出せる点が大きく違いますね。
それでイテレータではなくシーケンスなのだと思います。

あと他のarcを含めたLispと比べて、
mapやvectorがファーストクラスで
マクロでも簡単に扱える点もいいですよね。
>自分の周りの開発者はおもにPython系になりますが、
>Mac7割、Ubuntu2割強、Windows1割弱、という感じで
>OS Xは多いです。

Mac7割って凄いパーセンテージですね(笑)。へえ。
そこまでMacって人気出てるんですか。

>Pythonのイテレータは状態を持っていて、
>イテレータから要素を取り出すのが破壊的な操作なんですが
>Clojureではそうではなく、n番目やn番目以降というのも
>簡単に取り出せる点が大きく違いますね。

ああそうですね、Pythonって結構破壊的動作が多かった気が・・・・・・うん。

>あと他のarcを含めたLispと比べて、
>mapやvectorがファーストクラスで
>マクロでも簡単に扱える点もいいですよね。

ちょっとClojureのビデオ真面目に観てたんですが(笑)、ベクタの入力も楽ですね。
リーダーマクロ(って言うのかしら)絡んだ入力ってやり辛いですし。
そうだなあ、思い切って括弧の種類増やすってのはいいなあ。
ハッシュも使いやすそうですね。最初CLのハッシュ見たとき

「何じゃこれ?」

とか思ったのを思い出しました(笑)。

個人的にはマクロもファーストクラスになってたら嬉しいんですけどね。
やっぱ難しいのかなあ。
>個人的にはマクロもファーストクラスになってたら嬉しいんですけどね。
>やっぱ難しいのかなあ。

ファーストクラスのマクロというのは知りませんでした!
ちょっと自分で調べてみたんですが、Arcに取り入れられ損ねた
というやつですか?
マクロがファーストクラスということは、たとえばandがそうだとして
(apply and [true 1 2 ])
とか、
user => ( let [m and] (m true (println 1) (println 2)))
1
nil
のようにできたりするという事ですかね?
となると、プログラムの実行時に動的にマクロを展開するということでしょうか。
実用的な利点は私にはわかりませんが、
これはできたらかっこいいですね。

マクロとは違うものになってしまうかもしれませんが、ちょっと思いつきました。
普通の先行評価な言語の関数は、受け取った引数はもう評価済みですよね。
遅延評価な言語の関数だと、受け取った引数は、あえて評価する必要があるまで
評価されない訳ですよね。
なので遅延評価だったら、
user => ( let [m and] (m true (println 1) (println 2)))
1
nil
みたいなことはandが普通の関数であっても可能なわけです。
(IOの副作用が混じってるのは深く考えずスルーしてください。)
遅延評価ならifやcondが特殊形式である必要がないという
SICPにも書いてあったのあれです。

ということは、
1.プリミティブな関数は、評価済みの値ではなく、
S式と、評価するための環境(束縛とか)を受け取る。

2.それだけでは不便なので、受け取ったS式を受け取った環境を使って
自動で評価されたものを受け取ったあとの処理だけを記述する、
普通の先行評価とおなじように関数を定義できる
構文orマクロのようなものも用意する。

という言語があれば、遅延評価のようにifを関数として定義する事も、
マクロの実行時展開と同等のことをすることもできるのではないでしょうか。
わかりにくかったらすみません。
もしかして同様のものが既にあって名前がついていたりするのでしょうか?
Klosureの仕様にどうですか?(笑)
>名前がついていたりするのでしょうか?

call by name とか call by need とか呼ばれる機構で、古くは Algol 60 の頃からあったりもします(Algol 使ったこと無いけど)

最近だと io(http://iolanguage.com/)とかが積極的に使ってたりします…
おっと、それは多分誤解です。
call by nameの理解が間違ってるとあれなので
http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4-05w/text/eopl014.html
を参照しました。

(hoge x (f y))
これを、
(defn hoge [1 3] ...
という、値の形で受け取るのが、call by valueもしくはcall by referenceで、
先行評価の普通のLisp系言語の動きですよね。
それでもって、もしcall by nameだったら、
(hoge x (f y))
これが、
(defn hoge [(fn [] x) (fn [] (f y))] ...
となるわけですよね。
ここまでで間違ってたらすみません。
これだとたしかにifやandの短絡を特殊構文やマクロでなしにただの関数として、
実装できますが、マクロのように構文を自由に導入するようなことは
できないですよね、シンボルやS式を操作しているわけではなく、
実際にthawするかどうかを選べるだけなので。

それで、ここまでを前提条件とします。
今回言いたかったのは、
(hoge x (f y))
これが、
(defn hoge ['[x (f y)] {x 1 y 5 f #'user/f}] ...
というかたちで、
x (f y) の部分を、マクロのようにS式として受け取って、
シンボルの束縛を解決するための環境も、
例えばhash-map で{x 1 y 5 f #'user/f}のような形で受け取る
と、こういうことです。
これだと、(f y)の値はまだ得られていませんが、
hash-mapと'(f y)から(#'user/f 5)としてやれば値は得られます。
こうやってひとつひとつthaw してして素直に値を求めると、call by nameのような
こともできますし、
'[x (f y)]を変形して、'[(when x (f y))]とか、[(f y "x")]のようにしてから、あらためて値を求めれば、マクロと同等のことができるのではないか、という事です。
どうでしょうか?
これができても何が嬉しいのかは
まだわかりませんが。。。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Clojure 更新情報

Clojureのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング