Twitter: @kinaba
現状の Phobos (Dのランタイムライブラリ) は locale が UTF-8 じゃない環境だと全然使えません。 文字が化け化けです。…という話題でDスレが盛り上がってました。自分は必要になるたびに場当たり的に対処してたのですけど、せっかくなので 手元に散らばってるソースからそれに対処してるつもりっぽい箇所を寄せ集めてみました。
→ tx
ついでに、writefln が writefln しかないのが不便だなーと前に言ってた点についての 場当たり的対処が入っています。あと、readf が面倒だと思って Java の Scanner 風のを D で書いたヤツが どっかにあるはずなのでただいま探索中。あー、ファイル名の文字コードもどうにかしないといけないんだっけ。
wchar_t が Unicode でない環境が今手元にないので、その部分は未テストです。昔は動いてた、はず。
つい勢いで深夜0時に秋葉に並びにいってしまった人がここに。 や、近所だし…。
TシャツとUSBメモリとボールペンとシールをくれました。
FOOL/WOOD 2007 (Workshop on Foundations and Developments of Object-Oriented Languages) は、 オブジェクト指向に関する学会です。元々FOOLとWOODは別で、あとで合併したらしい。 論文は全て Program のページからダウンロードできます。
ひとつも発表聞いてないので、これは論文読んでまとめるよ大会です。
所有権 ownership という言葉は, C++ においてほぼ最重要と言っても良いほど重要な概念" とおっしゃっておられるように、オブジェクトの「所有権」という考え方は大事です。 所有権を扱う型システムとして Universe Type というのが既に提案されているらしくて、それを Java や C# の Generics 対応にしてみましたというお話。
public interface ConnectionListener {
public void connectionClosed();
public void connectionClosedOnError(Exception e);
forthcoming
public void connectionAuthenticated();
}
interface を使う側は、forthcoming メソッドはまだ呼べない。interface を実装する側は、
まだforthcomingメソッドは実装しなくてもいいけど、実装しないと警告が出る。移行期間中は
しばらくforthcoming状態でAPIを提供しておいて、機が熟したらforthcomingを外す、という使い方をする。
class Graph {
class Node { List<Edege> edges; }
class Edge { Node src, dst; }
}
class CWGraph extends Graph { // 色と重みつきグラフ
class Node { Color color; } // Graph.Nodeを継承したい
class Edge { double weight; } // Graph.Edgeを継承したい
}
ここで問題は、CWGraph.Node.edges の元は Graph.Edge ではなく CWGraph.Edge でなければならないし、
CWGraph.Edge.src は CWGraph.Node でなければならないということ。Graph.* を継承せずに全部新しく自前の
フィールドを持ってしまうと、Graphを操作する用作られたライブラリが使えなくなっちゃうので、継承はしたい。
こーいう風に相互に絡まってるクラスを一気に継承したい、という話は
JX や Scala や
gbeta が実際このようなものをサポートしているのだけど、
dependent type とか頑張っちゃっててややこしいので、そういう複雑な道具を使わずにこの手の継承入りの言語を
定義づけたい、という試みだそうです。しっかし Scala は本当にそこかしこで名前を聞くようになってきたなあ。
// JX
void make_loop(final Graph.Edge e, Graph[e.class].Node n) { e.src = e.dst = n; }
これより
<exact X extends Graph.Edge>
void make_loop(X e, ^X@Node n) { e.src = e.dst = n; }
こうの方がわかりやすくない?という例が論文に載ってました。「Genericsの型変数を使う」
「"^" という内部クラスの親に戻るパス表現」「"." の代わりに "@" という "exact type" を表すパス表現」
辺りを入れた感じ、だと思う。exact typeというのは、"^X@Nodeのまさにそのクラスのインスタンス" だけを許すという
意味で、"^X@Nodeの派生クラスのインスタンスはダメという型" だそうです。^X.Node にしてしまうと、
この make_loop 関数が Graph@Edge と CWGraph@Node < Graph@Node をつないでしまう可能性を型システムで
はじけないので不十分。などなど。
lazy
という修飾子を1個用意さえすればよい。
class List {
int head
lazy List tail;
List( int h, lazy List t ) { head=h; tail=t; }
static lazy List intsFrom(int n) { return new List(n, intsFrom(n+1)); }
}
int n = intsFrom(1).tail.tail.head; // 3
lazyでない型が必要な文脈でlazyな型の値が現れていたら、そこでforceする(例えば ***.tail の *** には
非lazyなListが来るべきなので、そこにlazy Listが来てたらそれをforce)。逆なら逆にdelayする。それだけ。
ちょっと面白いなあと思ったのは、lazy List を返すメソッドを定義すると、それはreturnの式だけではなくて、
メソッド全体をdelayするという意味にとるらしいこと。確かにそれは便利かも。
実装は明示的にサンクを操作するJavaのコードに変換するようです。Javaを拡張しましたという話を見るたびに
Polyglot の名前を見るので一度さわってみようと
思いつつ早幾年。誰か「3分でわかるPolyglot」とか書くとよいよ!
POPL の最初の2日については 住井さんの実況(1) (2) にまとまってます。あと他で面白かったのは…
[PDF] "Program Verification as Probabilistic Inference"。POPL3日目。 プログラムの各ポイントで成立する事前条件・事後条件の計算をする新しいアルゴリズム。 最初は各ポイントにランダムな命題を割り当てておいて、それだと当然論理的に矛盾しているので、 矛盾が減る方向に変形していく。と、最終的にだんだん正しい条件に収束していくとか。
"Streaming XML transformations using term rewriting"。
PLAN-X 2007 (Programming Language Technologies for XML) の発表。
ごく普通の関数型言語のスタイルで書いたXML変換プログラム(≒ treeを受け取ってtreeを返す関数)を、メモリに
treeを全部構築しないで、できるだけインクリメンタルに、ストリーム処理してくれるXStreamという言語。
- 一番単純な意味論だと、SAXのイベントストリーム [<a>, <b>, </b>, <c>, </c>,
</a>, EOF] からxmlの木構造(node(タグ名,子供,次の兄弟) という木とする)を構築して、
それをmainに食わせて、ひたすらreductionして出てきた木が答え、になる。これだと全然ストリーム処理じゃない。
代わりにまずSAXのストリームを代入ストリームと見なす [x0:=node(<a>,x1,x2), x1:=node(<b>,x3,x4),
x3:=null, x4:=node(<c>,x5,x6), x5:=null, x6:=null, x2:=null] 。
- で、プログラムは初期状態 term = main(x0) から始まる。
- repeat { 評価できる部分がなくなるまで、term を評価する;
代入ストリームの先頭要素を読み出して、その代入をtermに対して実行; }
とやると最終的に普通に全部xmlの木を作ってからmainを評価したのと同じ木構造がtermに
入ることになるんだけど、代入ストーリムの考え方は出力にも使えて、完成した木構造を逐次出力に
出していくことが可能。
こういう評価戦略(遅延評価とも正格評価とも違う)をとるとわりとストリームチックに動くらしい。
この評価戦略面白いなあ。
とまあ、そんな感じで。まとめおわり。
聞いた発表をまとめるよ大会。 PEPM 2007 (Workshop on Partial Evaluation and Program Manipulation) は、 部分評価とかプログラム変換とかそういう話の学会です。
以上XMLの話が連発。次はPartial Evaluationの話。Partial Evaluation (部分評価)というのは、 プログラムと、静的に固定したいパラメータを与えると、そのパラメータに特化したより効率的なプログラムを 出力してくれる変換全般のことをいう、と思う。
次が初日最後のセッション、領域特有のプログラム変換話。 自分の興味あるトピック2連発だったので特に熱心に聞いてました。
2日目。
長くなったので他はまた別の機会に。この調子で書いてたら終わらん気がしてきました。
帰ってきました。ちなみに[わなD]3章は一行たりとも書けてませんうぎゃー。
学会で聞いた発表メモとかは明日にでも。
1日目。成田→ロンドン→ニース。空港からホテルまではバスで。停留所のアナウンスが… 聞き取れないとかいうレベルでなくて、運転手さんだんまりな気がするんですけど! 私の耳が突然悪くなったせいか、どっかに表示が出てたのを見落としてたかだと思いますが、どこで [降ります] ボタン押せばいいのかわからない。適当に距離的にこの辺だろうと思ったとこで2人コンピュータ科学者に 見えなくもない人が降りたので、ついてってみたら正解。チェックインして即就寝。
PEPMの日。2日目。昼休みにちょっと散策してこようと思ったが最後迷って2時間くらいうろうろしてました。 危うく午後のセッション遅刻寸前。 ニースでは今路面電車敷設の大工事中で、 道が渡りにくくて&わかりにくくてなかなか大変です。 夕食は、ホテルの人に教えてもらったおいしいフランス料理の店に行くという 日本人研究者集団に混ぜてもらったら着いたのはおいしいイタリアンのお店でした事件。
TLDI→PEPMの日。3日目。 そういえば会場に無線LANが用意されてたんですが、デカい通信が全部ブロックされていたみたい(?)。 Wikiにメモとろうとしたらちょっと長いページを作るたびに蹴られて大変でした。 あと、世界各国McDonaldに行こう同盟の自分としてはこの日の夕食はビッグマックでした。
POPLの日々。4~6日目。 住井さんの実況(1) (2) がどんどん更新されるので、ふむふむとチェックしておりました、現地で。 その実況に載ってるようにランチでお隣がOege de Moorだったりして、国際学会に行くと "これがあの論文/本/プログラムの著者さんか!" 的な偉い人が山ほどいらしてミーハーな自分としては 楽しくて仕方がない感じです。 さて、7日目に自分の発表があるのでこの辺りから精神的および時間的余裕がなくなってきました。 ちょうど モンテカルロ・ラリー をすぐそばでやってて、 昼間は学会があるから無理としても朝夕ちょろっと兵どもが夢の跡でも見てこれないかと目論んでたのですけど 無理でした。
PLAN-X。7日目。おわたー。並行してFOOL/WOODというワークショップもあって、終わったあとに部屋の前を 通りがかったら最後の発表者の最後のスライドが見えてとても面白そうでした。参加者のひとに proceedings 貸してーと頼んだら、冊子にはなってなくてwebから論文pdf落とせるよ、とのことだったので早速読む。 今日でPOPLと併設ワークショップは全日程終了。 夕食は、おいしいフランス料理の店に行くというフランス人研究者集団に混ぜてもらったら おいしいフレンチのお店でした事件(じゃない。
8日目。午前中は Tralala に参加してました。 午後、空港に向かうバスは相変わらず停留所がわかりませんが、今度は終点で降りればいいので問題なしです。 ニース→ロンドン→エジンバラ。さすがに寒いなあと思いながらホテルに直行。 ここに来てゴーコンWがついに 本領発揮であります。フランスの電源プラグはCタイプで1パーツしか使わなかったのですが、 BFタイプのイギリスでは2パーツ合体変形ですよ!
9日目。 世界各国McDonaldに行こう同盟の自分としては朝食は(略。 エジンバラ大のセミナーで発表させてもらってきました。ガシガシと突っ込んでいただきました。 さて、夕方。k.inabaと言えばドラクエ3でありエジンバラと言えば ゆいしょただしき おしろ の地であります。これは立ち寄らねばということで、消え去り草(11ポンド(別名入城チケット))を買って潜入。
10日目。起きたら熱と寒気で死にそうでした。 ふらふらしながらエジンバラ→ロンドン→東京。
明日からちょっと ニース 行ってきます。
最初は PEPM → POPL → PLAN-X と参加してくるつもりでいたのですが、 Conor McBride 氏の招待講演があると聞いては TLDI にも参加登録せざるを得ない。この方の 型を微分する話 や Applicative はかなり好きな論文なのです。 さて、16日の日程が重なっているわけですが、どっちの発表も面白そうだから困る…。
あと、別に必要ないけどこの際だから勢いで、と、ずっと前から気になってた 変形合体!電源形状変換!! を買ってしまいました。そして、変形合体させても想像してたよりあまり楽しくなかったので困る。むぅ。
わかったつもりになるD言語、公開しました。
第1章は、「とりあえず D って最近名前はちらほら聞くけど、実際どんな感じなの?」 という人向けに、ざざざざざっと言語的な特徴をお見せしてます。第2章では、「んじゃ一瞬 D とか いじってみるか」 と思った人向けに、コンパイラ2つの簡単な解説とインストール方法の説明など。 あとまあ、そんなに整ってるわけでもないですが、開発環境についての情報。第3章はまだ書いていませんが、 本家のリファレンスなど読みつつ実際に D で遊んで見始めた人向けです。知っておくとお得な(バッド)ノウハウや、 D の面白い言語機能について詳しく突っ込んで調べてみる企画等。第4章は参考リンク集。「Dについて情報を 押さえるにはどこをみればいいの?」ってよく聞かれるので、ここ見とけばいいんじゃない?という回答でもあります。
というわけでよろしくお願いします。
"わかったつもりになる" というタイトルについて少々。
実際 "わかる" には手を動かしてプログラム書いてみないとやっぱりダメだと思うのです。 でも、前にもちょろっと書いたんですけど、「○○言語って書いたことないけど、 なんかこんな言語でこういうコミュニティとこういうツールがメジャーでこんな風に使われてるらしいぜー」 て語ることができてしまうような、そういう空気/空間/雰囲気を積極的に伝えるような紹介を読むのもまた、 自分はわりと好きなのです。まずそういう雰囲気を知って初めて、これは面白そうかもと "わかる" フェーズに手を出すことになるわけで。 "Let's Boost" や "わなD" はわりとそういう方向性で書いていて、それがつまり、今のタイトルに繋がりました。
気がついたらすでに一月九日でした。
D 1.0 と Groovy 1.0 が新年リリースということで、めでたいですね。 さてところで、いい加減 D Memo が古すぎて存在自体が 害になってきていると思うので、この機にあわせて全改訂版 D Memo に入れ替えて公開する計画だったのです。 ところが、気力がないとか眠いとかだるいとかいう大変な理由で全然進まないという大問題が発生しました。
などと書いて満足してると本当に進まないので、 「1/12 24:00 までに4章中3章までの完成版を出します!」。 ここで宣言。プレッシャープレッシャー。残りは「1/21 8:00」を目標とします。 その時ネットにつながる環境にいるかどうかわからないので、もしかしたら1/24になるかもしれません。
D Memo の方でも触れましたが、すでに C/C++に疲れた人のD言語 という素晴らしい D 1.0 の紹介が存在しています。 ニュースを聞いてDをかじってみたくなった方に超オススメです。 改訂版ではあちらと重ならないような方向に進んで補完できれば、という予定です。
今年もよろしくお願いします。
昨年好きになった作品に、『巫蠱』 をあげ忘れてたなあ…と思い出しました。ラスト一行を読んだ瞬間に、俺の全想像力が第二段落のイメージを 再構成し始める感覚。ちょうどその前の月にまつもとさんの 「蠱毒?」 を聴いて面白いな、 と感心していたところだったので、合わせ技でさらによくわからん脳内反応が起きていました。