85% 冗談です。
class typelist {}
template Last(TL) { alias typeof(TL.keys [0]) Last; }
template Rest(TL) { alias typeof(TL.values[0]) Rest; }
template Length(_:typelist) { const int Length = 0; }
template Length(TL) { const int Length = .Length!(Rest!(TL)) + 1; }
template At(int _:0, TL) { alias Last!(TL) At; }
template At(int N, TL) { alias .At!(N+1,Rest!(TL)) At; }
unittest
{
// 何要素のtypelistでもどんと来い!
alias typelist TL0;
alias typelist[int] TL1;
alias typelist[ireal][char[]] TL2;
alias typelist[Object][void*][int delegate()] TL3;
// 末尾からのindexでアクセスする仕様...(^^;
assert( "Object" == At!(-2,TL3).classinfo.name );
assert( 0 == Length!(TL0) );
assert( 2 == Length!(TL2) );
}
問題は連想配列のキーにできない bit
型とかをリストにつっこめないこと。あと Last!
と
Rest!
が上のコードで実装できちゃうのはバグのよな気がする。
Net.Objectdays 2003 の発表内容は このページ から見れるっぽい。Generative Programming と MetaOCaml のチュートリアルがいい感じ。"A Selective, Just-in-Time Aspect Weaver" - 動的アスペクトを実現するには、従来法だと全ての Joinpoint にメソッド呼び出しを挟み込んでおいて、そのメソッドの中で Pointcut が定義されているか毎回調べる…とかやっていてやたら重かったのだけど、 代わりにブレークポイントを置いとくなどして高速化するぞ、という話。 "Concept-controlled polymorphism" - 要するに boost::enable_if の話。間もなくリリースされるはずの Boost 1.31 に含まれることが決まっているコンポーネントなので、Boost使いは要チェック。 内容は Type Classes in C++ という勢いで、 Haskellの型クラスで記述できるようなandだけにとどまらず、or や not など任意の論理演算を条件につかった型クラスのインスタンス化が C++ なら enable_if によって実現できる、とか色々。その分、 コンパイル時間がバカ遅かったり構文が変だったりするのは毎度のことなのですが。
徳永英明の「僕のそばに」が思わぬ方向から有名になっているらしい。えーと、 私はどっちの曲にも互いに無い良さが感じられて好きなのです。 サビのメロディは偶然にか故意にかはともかく一緒だけれど、 歌い方や編曲や全てが、片や "不器用すぎるけど いつも見つめてる" という切なる歌に、片や "やわらかな風に吹かれ 君と歩いていこう" というあたたかな歌に仕立て上げているではないですか。
10年来のファンとしては、 この騒ぎをきっかけに徳永英明の曲を宣伝したくてたまらないわけです。 というわけでここでは、「桜」 の旋律や 「僕のそばに」 を聴いて気に入ったという人にオススメしたい3曲を紹介させていただきましょう。
一曲目は「花」。 アルバムには、よりバラード風に変えて「honesto」に収録されています。私はミディアムポップなシングル版の方が好きだけど、 少数派っぽい。"心のままに 涙 流せたら…"。二曲目は 「太陽の少年」。 アルバムは同名のもの。近いようで遠い昔の思い出。三曲目は 「僕の時計」。 歌詞は妙にキザったらしいんですが、よくよく聴いてみると 「僕のそばに」 と同じ心情が流れている二重底の名曲。
100のうち1つも、自分の感じている良さをコトバで伝えられなくてもどかしいけれど、 そんな感じです。
C++のテンプレート使いなら typedef template が欲しい!と叫んだことが二度や三度はあると思いますが、 ニュースグループで、D言語 なら typedef template なんぞ既に実現できてますよ? とな。 うわ、この短縮構文ってこの効果を狙って導入したのでしょうか。天才だ。
class SomeTemplate(T,U,V) {} // 3引数のクラステンプレート
template SomeAlias(T) {
alias SomeTemplate!(T,T,int) SomeAlias; // alias template!
}
...
SomeAlias!(char) x; // SomeTemplate!(char,char,int) x; と同じ
templateのオーバーロードと組み合わせると、更に素敵なことになりますね↓
class SomeTemplate(T,U,V) {}
template SomeTemplate(T) {
alias .SomeTemplate!(T,T,int) SomeTemplate;
}
SomeTemplate!(char) x; // ok. SomeTemplate!(char,char.int)
SomeTemplate!(int,double,char[]) y; // ok.
今のC++でこれができないのは 「関数テンプレートの引数に template typedef が来たときに暗黙のインスタンス化をどーすんのよ?」 という議論がまとまってなかったからという一点に尽きるので、 暗黙のインスタンス化を諦めたD言語なら何の問題もなく実現できるわけですな。
とは言え実際のところ、暗黙のインスタンス化無しとなると
実行時プログラムの世界ではそこまで嬉しいというほどでもなくて、
むしろメタプログラムの可読性に主に効いてくるような気がします。
具体的には shinishiro.h さんの typelist.d が TypeAt!(typeList,3).value
でなくて
TypeAt!(typeList,3)
の形で使えるようになるとか。
OpenOffice.org の保存ファイル形式って、単純なzipというかjar書庫なんですね。 Noahだと拡張子ではなくファイルの中身で 「圧縮すべきか解凍すべきか」 を判断しているので、OOoで作った文書を圧縮しようと思ってNoahに送ったら、 複数のxmlファイルに展開されてちょっと驚きました。
知ってるユーザならば 「これはjpegとかと同じでわざわざ再圧縮の必要がない形式」 と分類して圧縮を試みないことにすると思うので困らないでしょうが、 WordやExcel文書と同じ感覚でNoahに投げ込んだ人は混乱しますよねぇ、これ。 どう対応したものか。
こんなのがコンパイル通って動くそうです。おもしろー。
/* ネタ元 >>181 */
/*
↓のようなグローバル変数をどっかのファイルで定義
int i ;
int j[4] = { 4, 5, 6, 7 };
int matrix[4] = { 0, 1, 2, 3 };
*/
extern int i;
extern int j[4];
extern int matrix[4];
int main()
{
for( i=0; i<4; i++ )
printf( "%d\n", matrix[i][j] ); /* 多次元配列? */
return 0;
}
正直に書くと、自分で書いてソースをいじり始めるまで理由がわかりませんでした…。 (^^; 気付いてみれば「邪悪なC」の定番中の定番の話なんだけど、extern だのグローバル変数だの言うコメントに思いっきりミスリードされてしまった。
"要約すると次のとおり"…ってーと、えーと、"さまらいずど・あず・ふぉろーず" だ。
で、"さまらいず"って綴りは何だっけ。summerize?なんか違和感がある。よし、
オンライン辞書で確認だ。[summerize]
っと。「暑気から守る」という意味らしい。違う。
いくら私が偶然今日の午前に風来のシレンの サウナ部屋
技について検索していたといっても、それは違う。どうも正解は [summarize]
のようだ。
冠詞の付け方がよくわからんーなどと言っていたら、指導教官が「チャートでわかるaとanとthe」て本を貸してくださった。早いとこ眺めてみよう。
要は卒論書いてる最中なんですが、なんかもうえーごは疲れた。
Google Code Jam 2003 のTシャツ届いたー!あとボールペンも。
これ狙いで参加したので、実に嬉しいことであります。 ところで裏の棚にあるちょっと汚れた白い物体、バルタン星人ぬいぐるみなのだけど、 これ洗濯しないといかんね。Googleとは全然関係ない話ですが。
このカクテルアイコンも良さげだ。
GPCE'03 (Generative Programming and Component Engineering) の 議事録 がこんなとこにあった。ACM のデジタル図書館のなかにあるので、大学からでないと見れないのが面倒くさいなぁ。 タイトルからして面白そうなのが、"Concept-controlled polymorphism" やら "An extension to the subtype relationship in C++ implemented with template metaprogramming" やら幾つか。あとでちゃんと読もう。
最近どうも"文献を読みました日記"で終わってしまってるのが実によろしくない。
ディキ・ディキ というカクテルがあるそうなので、 これにちなんでDikiのシンボルマークを決めよう! …と考えてGoogleで 「カクテル アイコン 素材」 などと検索している暇は無いのだということを自分は自覚すべきです。 それにしてもこちらのアイコン集綺麗だなー。
"A Comparative Study of Language Support for Generic Programming" (リンク先PDF)を読みました。Boost.Graphライブラリを題材に、 6つの言語におけるジェネリックプログラミングの比較をしています。比較対象に Ada が無いのが少し残念だけど。私が面白いと思ったのが 「conceptとmodel」の関係を記述する機構の比較で、
Java/C#/Eiffelみたいに、「この型はこの concept のモデルである(これこれこのような処理をジェネリック関数の中で適用できる)」 という宣言を型の定義時に明示的にしておかなけりゃいけない言語だと、 データとアルゴリズムを完全に独立にできないのでいささか面倒だとか。
MLみたいに、型の側での明示的宣言はなしで、必要な signature を持った関数が全部存在すれば自動的にconceptのモデルと見なす、 という方式はこの点嬉しいけど、 「たまたま関数の名前と引数が同じだけど意味的には全く違う場合」 をコンパイル通してしまうのが宜しくないとか。C++もこの利点欠点に関しては ML と全く同様だけれど、そもそも "必要なsignature" を指定する方法が言語的には用意されてないので、不適切な型でジェネリック関数を 使おうとしたときのエラーメッセージが大変なことになったりする。 ライブラリによって改善は可能。
この問題については、Haskellのような「型クラスとinstance」によって、 型定義の外部で「conceptとそのモデル」を記述できるのが良さげ。 ただし現状のHaskell98規格レベルの実装ではどーにも力不足で、 複数パラメタ型クラスとか関数的依存とかが必須だとか。(でも、二大実装である Hugs と GHC ではどっちもこの拡張をサポートしてたはず。Hugs で functional dependency が使えたかどうかちょっと自信ないけどたぶん。)
サクラエディタ Unicode版 0.6.2 で、UTF-8テキストから ShiftJIS にない文字もちゃんと読み込めるようになったそうです。 あと、MSLU (The Microsoft Layer for Unicode) を使って Win9x でも動かせるようになっているとのこと。しばらく使ってみようかな。
豆の木を登ったり飛行機を乗っ取ったりする "ジャック" を入力しようとして変換したら、"惹句" と出てきました。この単語、恥ずかしながら今まで見たことがなかったのですが、 意味は要するに"キャッチフレーズ"らしい。見たまんま。 しかし"キャッチフレーズ"と比べて響き自体もなんとも魅惑的な感じがするので、 今後からは"惹句"と書くようにしようと思います。 ただし、キャッチフレーズなんて言葉を使う機会が今後あるかどうかは微妙。
TTL ( the Tiny Template Library )。
Boostにあるコンパイラ互換性のための山のような応急処置を切り捨てて、マトモに
C++ 標準をサポートするコンパイラのみにターゲットを絞ったライブラリだそうな。
現在あるコンポーネントは function, tuple, variant, signal, typelist
。本質的な部分だけが残ったソースは非常に短くまとまっていて、
C++ という言語の強力な表現力が実感できます。
ネタ元は LaLa Moo-Moo氏の日記 でした。
エキサイトの中→日翻訳で、 左のボックスに人の名前を入れて [中→日] [簡体字] の設定で翻訳すると面白いよ、 というスレ@2ch。「例 緒方孝市→ひげの源の成熟が遅い〓」 というのを見て猛烈に笑ったので自分でも半信半疑でやってみました。
稲葉一浩
あー、ネタ元スレは「好きな人の名前を中→日翻訳してみるスレ。」 とかいう名前なのだが私は別に好きな人は自分、とかいうわけでは決して無く、 その、まぁ、ねぇ。他に適当に試せる名前って思いつかないし。はい、気にするな。
愛か?〓は気が狂う
そんな。
アーカイブX というアーカイバを知りました。 lzh や tar やら 7z やらをエクスプローラで直接開いて見れるようにする、 というもの。エクスプローラのcab/zipに対する対応方法を目にしてから たぶん何千人もの人が考えたけど、Windows Shell の仕組みを覚えるのが面倒いので実現しようとしなかったアイディアだと思います。 それが遂に登場。素晴らしい! ツリー型アーカイバの決定版と言って良いのではないでしょうか。
個人的には、ちゃんと整備された ActiveX コンポーネントの形でインストールされるので、JScript とか、もしかしたら MocaScript から アーカイブX を通じてフルに書庫操作が書けるようになるのが嬉しい。
今まで長いこと "卵から雛" がNoah標準の書庫アイコン画像でした。 そろそろこれも一新すべし、ということで SB が新しいアイコンの案を描いてくれたので、それに私が微妙に注文つけたりしつつ、 とりあえずこんな感じのを描いてもらえました。モチーフは "手紙と羽ペン"、かな?
どーでしょう? 3201~3207のどれがいいとか、前の方がよかったとか、 この辺をちょっと変えると良さげかもとか、書庫絵が"手紙"って違和感あるーとか、 ご意見ご感想ある方はメール/掲示板/口頭/郵政省メールなど、 私かSBまで気軽にお伝え下さい。
黒っぽい背景だとこんな風。
今日は、Peggyエディタシリーズ用のスクリプト言語として開発されたらしい、
MocaScript という処理系を使ってみました。ほぼ ECMAScript
仕様にのっとっていて、しかも __proto__
があるので真っ向からプロトタイプ連鎖を扱える! arguments.caller
もある!なかなか気合いの入った作りになっているみたいです。
関数内関数を事実上使えない(関数内に関数リテラルを置くことはできるけれど、
中から外の関数のローカル変数に触れないので、外置きと変わらない)
のが結構痛いけれど。。。
しかし、MocaScript も含めて、.caller
で呼び出し元の関数ではなく
arguments
オブジェクトを指す実装がほとんどだけれど、
実は私、これってどういう使い道があるのか把握できていないのです。
こんな感じかな。
function default_arguments_are( def_args ) {
for( i in def_args )
if( arguments.caller[i] === undefined )
arguments.caller[i] = def_args[i]; // 呼び出し元の引数を置き換え
}
function f( x, y ) {
default_arguments_are( ["ABC", "あいう"] );
writeln( x + y );
}
f( "αβγ" ); // "αβγあいう" と表示
こういうトリッキーな遊びはさて置くにしても、File, Pipe, FTP,
getActiveWindow, sendMessage, ActiveXObject, searchPath
のようなWindows向けのスクリプトを書くには必須なライブラリが、
WSHにあるような複雑な形ではなくわかりやすく提供されているのが便利。
ちょっとした作業をスクリプトで書くにはJScriptより適してるのではないかと。
夕刊を読んでいたら、広告の 「Matrix Revolutions」「あと2週間」 の文字が目に飛び込んできました。やばい、早く見に行かないと。
検索エンジン、スコアリング順序の的確さが群を抜いていると感じて、 私はもっぱらGoogleを使っていました。しかし最近、ふと気分転換に使ってみた ceek.jp の並べ方が更に良い感じな気がします。 国内サイト中心に検索結果を出すようなので、Google日本語 の代わりにしばらく使ってみようかなーと。 【今後搭載したい機能】にクラスタ分析があがっているのでちょびっと期待しつつ。
LtU 経由で "DSL Implementation in MetaOCaml, Template Haskell, and C++" (リンク先PDF) という論文を読んでました。GenerativeProgrammingの人と HaskellでParallelな人と FACT!の人と MetaOCamlの人との共著ってなんか凄いなぁ。 各々違ったアプローチでメタプログラミングに対応する 3 種類の言語の比較です。
MetaOCaml は、"Tという型のコード"という意味の新しい型<T>
と、
それに対する基本演算(bracket, escape, run)を用意して、「コード」
というものを値として言語で扱えるようにしたもの。プログラムの生成は、
基本的に実行時に動的に行うことになるらしい。他の2つと大きく違う点は、
生成結果プログラムが型エラーになるようなメタプログラムは、
実際の生成処理を行わずとも型システムで
エラーを検出できる点。あと、<<<<T>>>>
のような型を持つメタメタメタメタプログラムなども記述できる辺りが面白い。
値を持つ式しかコードとして扱えないので、「型の宣言」を生成できないのが少し残念。
Template Haskell は、コンパイル途中に、 プログラムの構文木という木構造を自由に操作できるようにしたもの。 他と比べての特徴は、"コード片" という単位でなくて構文木レベルでいじれるので、 生成できるプログラムの任意性がずっと高いこと。 パラメータ文字列に応じて新しい名前の関数やデータ型の定義を生成、 なんてこともできる。ただし生の構文木をいじることしか出来ないので、 コードを展開したときに変数名がぶつからないように気を付ける、 とかの処理があまり自動化されないのがちょっと難あり。それから個人的には、 構文木から作っちゃうアプローチだと、 自動生成された部分まで追えるソースレベルデバッガを作るのが不可能になるのでは? というのがやや不安。
C++ は、"ユーザ定義型" をコードなどのメタ情報の担い手として、 "template" のインスタンス化とその際の型パターンマッチをその計算機構として、 コンパイル時にコード生成を行う。コンパイラの意味解析機構に同化しているので、 部分式の型情報を利用するメタプログラムが書けるのが特徴。 また、式でなくて型の上で色々処理をするので、ユーザが (コード生成を意識せず) 普通に式を書くと、裏で自動でメタプログラムが走る、という いかにも自動生成っぽいことができる。難点は、 もともとメタプログラミング用ではなかった言語機能を過剰利用しているので、 構文が不自然だし、色々根本的なとこで表現能力に制限がかかる点。