"with" loss of generality

03:19 03/07/27

大学の課題やっと二個目終わったー。こんなもんに時間使いたくないんだけどなぁ。

01:29 03/07/25

Microsoftが研究開発中のコンパイラフレームワークが Phoenix という名前らしいです。 Phoenix とか 元Phoenix とか Phoenix とか、 どんどん紛らわしくなって参りました。 みんな格好よさげな名前を取ってくるのが好きなんだなー、となんだか共感。

しかしそれにしてもややこしいので、ここはそれぞれ区別するために、 頭に頭文字を付けて マフェニックス(Microsoftのやつ) とか モフェニックス (Mozillaのやつ) などと呼ぶのはどうでしょうか。略してマフェとモフェ。 …ダメだこりゃ。

00:24 03/07/23

数日前に紹介したブサイクフィルタですが、「できるかな?」にてこちらは 美人化フィルタ が登場。 ああ、言われてみれば確かに逆変換に近いことができそうな式だ。 全然考えつきませんでした。感服。

言われてみればなるほどだ、と感心したアイデアとして、今日は他に 「自販機を無線LANのステーションに」、というお話。 確かに日本中どこでもほどよく存在してるよなー。

23:09 03/07/21

自分の行動範囲にあるコンビニから次々と黒BINTAが消えてるので僕は悲しいよ。こうなったら、今のうちに箱買いするしかないのか。 しないけど。

TyRuBa月間終了。Merd月間へ。

D言語

おお!D言語研究 という素敵なWikiが立てられたそうな。ここに日本語のD情報集まるといいなぁ。 私もちょこちょこ参加させていただこうと思います。

02:02 03/07/19

人の顔をブサイクに変身させる画像処理ソフトです、というアイデアの面白い ブサイクフィルタ なるソフト。結構昔からあるみたいなんですが、 今日うちに届いてた雑誌で初めて知りました。 自分の顔写真で遊んでみると確かにそれっぽく変換される。すげー。 いやオマエ変換前から不細工だろ、 という突っ込みはナシの方向で一つ。 ReadMeに変換式が載ってるんですけど、 こんなシンプルなのでこんな効果が得られるんだ、とさらにもう一感心中。

01:03 03/07/17

C++ has an elaborate meta-programming facility known as templates. ...(snip)... The fact that C++ templates are so widely used is very strong evidence of the need for such a thing: ...

We believe that Template Haskell takes a more principled approach to the same task.

Template metaprogramming for Haskell

…というわけで去る五月、Glasgow Haskell Compiler という最もメジャーな Haskell 言語の実装の一つに、Template MetaProgramming 機能が追加されました。 メタプログラミング好きには注目であります。

概要

どんな感じになっているかというと…

$( ... )

$( ... ) という括弧の中身がコンパイル時に評価されます。 評価された結果は型の宣言であったり関数の宣言であったり、あるいは普通の 「式」であったり、とにかくHaskellの「プログラム」。つまりこの $( ... ) の中に「プログラムを生成するプログラム」 を書くことでMetaProgrammingを行います。

例えば

$(sprintf "%s: %d\n") "k.inaba" 123

例えば上のようなコードが書けます。$( ... ) の部分がコンパイル時に評価され、最終的にHaskell言語のプログラムになります。 sprintf は、文字列を受け取って、「式」を返す関数。sprintf :: [Char] -> ExpQ

(\x y -> x++": "++show y++"\n") "k.inaba" 123

$(...)が評価され終わると、できあがるのは例えば上のような Haskell のプログラム。(\x y -> ...) が、 二つ引数を取って期待の文字列を返す関数となっています。で、 こうしてから更に改めて普通のコンパイルが行われる、と。 第一引数が文字列じゃなかったら型チェックでコンパイル時エラーが起きるなどなど、 タイプセーフな整形文字列化ができました。

MetaProgram

肝心の「プログラムを生成するプログラム」の書き方ですが、 まず簡易な方法として、[| ... |] という "疑似Quote括弧" を使う方法があります。[| ... |]... という「式の値」、ではなく「式」そのものを表します。

$( [| 123 + 456 |] )

ものすごく意味のないサンプルですが、この$()を評価した結果は、 123 + 456 という式になります。他に [t| ... |] で「型宣言」を表したり [d| ... |] で「値の宣言」 を表したりする簡易カッコが用意されていたり。

fib :: Int -> ExpQ
fib 0 = [| 1 |]
fib 1 = [| 1 |]
fib x = [| $(fib (x-1)) + $(fib (x-2)) |]

また恐ろしく意味のないサンプルですが、 整数Nをとってフィボナッチ数列の第N項の値となる式を返すメタ関数fibの例。 こんな風に、「式」を返すような関数であっても、Haskell の通常の関数と全く同じ構文で、全く同じ記述能力をもって書くことが出来ます。 なんと、ファイル入出力なども通常のHaskellと全く同様に使うことが可能! この辺りがまず、templateの言語と実行時の言語がかけ離れている C++ に対する利点と言えるでしょう。

Syntax Tree

[| ... |] だけでは記述力が不十分なことも当然あります。 例えば、整数I,Nを受け取って、「N要素tupleの第I要素を取り出す関数の宣言」 を生成する関数を書きたい場合。2要素tupleなら(x,y)、3要素なら(x,y,z)と 書けるけれど、一般にN要素のtuple、をまとめて表現する式は [| |] では難しい。

そこで、[| ... |] の他に、構文木を直接生成する手があります。

sel :: Int -> Int -> ExpQ
sel i n =
  lam [pvar "x"] (caseE (var "x")
     [simpleM (ptup [pvar("x"++show i) | i <- [1..n]]) (var ("x"++i)])

例えばsel 2 3 なら \x -> (case x of (x1,x2,x3) -> x2) を生成するようになってます。lamが変数名パターンと式を受け取ってλ式を返す関数、 caseE が式とパターンマッチを受け取ってcase式を返す関数。 ptupが変数名のリストを受け取ってタプルパターンを返す関数などなど...。 この方法で、本当に任意のプログラムを生成させることが可能、 なのもC++と比較しての長所。いかにも more principled approach という感じです。

他にも

(C++の構造体にあたるような)データ型の内部構造をコンパイル時プログラム 側で扱えるようにする reifyDecl 構文やら [d| ... |] による宣言の自動生成やら、 コンパイラ内部で出来るようなコード生成は全て言語内で可能なほど強力。

Future Work として、より型チェックを強力にする…例えば、ただの「式」でなくて 「Int型の式」という型を書けるようにして、template をインスタンス化する前に可能な範囲のチェックを行うとか、$() のような明示的な形ではなく、C++の関数テンプレートや Scheme のマクロのように、プログラマが意識せずとも適切にメタプログラムが走るような 自動推論機構があると良いかも、というような項目があがっていました。

21:58 03/07/15

ファミコン20周年だそうで。

最初にやったゲームは…覚えてないけど、たぶん定番の「スーパーマリオブラザーズ」 だったと思う。8-1 の、ブロック1個幅の足場を踏んで穴を越えるトコ が自分だけ越せなくて悔しかった記憶やら何やら。あとその頃はなんだっけ、 ドラゴンボールの「神龍の謎」とか、「ツインビー」、「ロードランナー」辺り。 「アイスクライマー」の落とし合いは熱かった。

小学一年か二年の頃に友達が「ドラゴンクエストⅢ」を買ってもらって、 そいつんちに集まってワイワイガヤガヤと遊んでました。 キャラに自分達の名前をつけてて、ちなみに自分は戦士の"いなくん"。 ルビスの塔のてっぺん近くで「うおー敵出るなー」 と皆で叫びながら一歩一歩慎重に十字ボタンを押してったり、 今考えるとバカみたいだけど、この時は本気で楽しかったのだ。

その後は「ロックマン2」やら「ドキドキパニック」、「マリオ3」、 「仮面ライダー倶楽部」…。2コンに息吹きかけると風車が回って体力回復するヤツ。 あと「ファミリースタジアム」の何年版か忘れた辺りをよく大勢でプレイしてた。 父方の祖父母の家で買ってもらった「クインティ」とか「ココロン」とか、 それまで聞いたことないゲームだったのでなんじゃこりゃ?と思ったけど、 傑作だった。

ってな感じ。

書いてみると、なんかパッと思いつくのはメジャーなタイトルばっかりでした。

そんなことより 冷やしファミコン が涼しげでいいなあ。

00:26 03/07/15

おととし富士山に上ったから今度は逆を極めたいという変な理由で、 去年からずっと、 日本の地表で一番標高の低いのはどこだ? というのが気になっておりまして。西半球最低はアメリカの デスバレー ってトコにあるらしいとか、最低の水準点は 関門トンネルにあるらしいけどこれってトンネルの中っぽいので却下、 など要らん豆知識ばかりが増えていくのでありました。

もちろん世界一はご存じ死海の-394mで、なんでもオランダの最低標高は-6.7mだとか。 日本水準原点は24.4140mと定められているそうだ。いやー勉強になります。

at last

…などと不毛な調査やらWeb検索やら続けていると、どん底-てっぺんツアー‘03 という素晴らしい旅を今まさに旅しておられる方のページを発見! 0メートルから富士登山、というのはよく聞くけれど、-4メートルから、 というのはいいですねぇ。自分でもやりたい。。。

23:27 03/07/13

近所の本屋に行ったら 鐵3 が売られていたので購入。アニメ化するらしい。 しかしそれにしても、リンク先の「コミック > マニア > ...」 という分類はなかなかハイセンスだと思いました。

>SB うむ。タンポポは欧州では健胃薬として用いられているらしいので、きっとキミにぴったりだ。 160円/350ml の価値があるかどうかは謎だが。

22:26 03/07/12

What Are Partial Types in C# ? C++やらJavaやらどの言語で書いてても、64日に1回くらいは この機能があったら使うのに…、という気分になるのでわりと期待。

夕刊を読んでた母が、数学オリンピックの記事で某メシさんが出てる、と教えてくれました。ホントだ。 明日明後日は頑張ってください>選手の皆様。

平手

一日一BINTA(黒)の日々。

苦みのもとはグレープフルーツの皮付近のあの苦さかと思っていたら、 成分表を見てみると「ビターハーブ」なるものが入っているらしい。 タンポポの根のことだそうです。私はよくわからんけど、 カンパリって酒の原液に近いかもという評価もあって、そういえば知り合いもそんなことを言ってました。ふむ。

ちゅーか、googleで検索してみるとあまり評判よろしくないのだけど、なんでだろう。 この飲み物は(値段高いけど)絶対うまいぞー!!

23:30 03/07/11

隠恋慕。楽しそう。

Gooooogle

他のブラウザやブラウザ補助ソフトにある機能でIEにも欲しいなあ、 と思っていた最後の機能である「ポップアップ窓を出さないようにする」ってヤツが Google Toolbar 2.0 BETA で実現されるようになったので、非常に嬉しい次第です。 いやまあ、このツールバー自体もブラウザ補助の一種なわけですが、 自分の頭の中では GoogleToolbarとス切りボとKill IE Logoの3つは IEと切っても切れない仲になってしまってるので、 あまり他のソフトという感じがしなくなってしまってるという状態。

で、2.0BETAですが、検索のボタンを非表示にできないっぽいのがちょっと。 「入力してEnterキー」でしか検索しないので、できれば無い方がよいのだけれど。 ハイフン入りのキーワードで検索したときにボタンからハイフンが消えなくなったのは、 これまた嬉しい点。

23:16 03/07/09

今気付いた。トップの150万踏んだ人おめ~。

今日は口内炎が痛くて何も手につかないのであった。

23:34 03/07/07

なぬ! Zetaのイベント があったなんて知らんかった。。。残念。またの機会を楽しみに待とう。

IPv6 アプリコンテスト2003 作品募集中、らしい。 IPv6を活かしたネタをあたためている方は応募してみてはいかがでしょう。 自分は今のところ何も思いつかないのでとりあえずブロードキャスト。

最近ペルシア戦争を書いた小説を色々読んでいたりするのですが、「炎の門」という今日読んだ本がなかなかに良かった。レオニダス王率いる ラケダイモン(スパルタ)の勇士300人が、その都市の名の頭文字 λ を刻んだ盾を左手に、数に数千倍するペルシア軍に挑みそして散る… というテルモピレーの戦い。と、そこに至るまでの物語。 ブ厚いのだけど最初から最後まで飽きることなく読めます。オススメ。

00:45 03/07/07

何故か自分の中では、7月7日のイメージは 「パンダが笹を抱えて川を渡っているの図」 なので、なんでだろうと思って考えてみました。 って、考えるまでもなく 七夕 → 笹 → パンダ という連想だなあ。つまらん。 こういう妙なイメージの植わっている日って色々あった記憶があるのだけど、 いざ思い出そうとすると具体的な他の例が出てこないや。

00:13 03/07/06

数学者トレカ というページを知りました。 実際にあったらちょっと欲しい。

00:46 03/07/05

吉野家の牛丼を食べたよワーイ。実は自分の記憶している限り、 生まれて初めてだったりします。わりと旨かったので、 今後時々行くかもしれない。あと旨かったといえば、サントリーの BINTA RefreshDry という奴が強烈に苦くておいしいです。Gokuriといいコレといい、 サントリーのグレープフルーツ飲料は当たりが多くて素晴らしい。

メモ:「Copyright Your Software」。あとでたぶん買う。

01:09 03/07/04

哲学者占いでウィトゲンシュタインと相性悪と言われてしまったため、ショックで夜もぐっすりです。

C++

vtblを埋める」 という面白そうな話を見かけたので考えてみました。 Loki::GenLinearHierarchympl::linearly_inherit みたいな余計な枝が作られないように注意して線形継承を生成。

#include <boost/mpl/list.hpp>
#include <boost/mpl/begin_end.hpp>
#include <boost/mpl/deref.hpp>
#include <boost/mpl/lambda.hpp>
namespace mpl = boost::mpl;

namespace detail {
  // fwd decl
  template<class Begin, class End, class Base>
   struct LinearInheritImpl;

  // empty case
  template<class End, class Base>
   struct LinearInheritImpl<End, End, Base>
   {
     typedef Base type;
   };

  // non-empty case
  template<class Begin, class End, class Base>
   struct LinearInheritImpl
   {
   private:
     // 先頭要素を取り出して
     typedef typename mpl::deref<Begin>::type Head;
     // lambda抽象して
     typedef typename mpl::lambda<Head>::type HeadFunc;
     // それを適用
     typedef typename HeadFunc::template apply<Base>::type NewBase;
     // イテレータは進める
     typedef typename Begin::next Next;
   public:
     // 以下再帰的に
     typedef typename LinearInheritImpl<
       Next, End, NewBase
     >::type type;
   };
}

// wrapper to accept mpl sequence
template<class Seq>
 struct LinearInherit
   : detail::LinearInheritImpl<
       typename mpl::begin<Seq>::type::next,
       typename mpl::end<Seq>::type,
       typename mpl::deref<typename mpl::begin<Seq>::type>::type
   >::type {};
#include "linealy_inherit.hpp";
typedef mpl::_1 _1;

struct Deriv
  : public LinearInherit<
      mpl::list< Base, BaseImpl1<_1>, BaseImpl2<_1> >
  > {};

まあ、力技ですな。

23:37 03/07/02

携帯電話で話している途中に充電が切れて通話不能になってびっくりした一日。 てゆーか、これは話してた相手の方がびっくりですね。スミマセン。 2週間に一度くらい充電すれば事足りるので、つい忘れてしまう…。

土曜から火曜の朝にかけて、学科の仲間と ICFP Contest に参加してました。言語はOCamlで。 といってもほとんど人力で解いてしまったので、 全然プログラミングっぽくなかったのでした。来年はちゃんと美しく解きたいところ。

23:33 03/06/27

がもう一膳。

検索をしていたら 「チーズを食べると離婚が増える」 という面白い例え話に行き当たりました。 この誤謬は時に陥りがちので気を付けなければならないけれど、かと言って、 例え因果関係ではなくても相関関係があるだけで興味深い、 という視点もおろそかにしてはならないとも思うのであるよ。

FC++ v1.5

C++で関数を中置に…ってどうやるのかと思ったら、

2 ^plus^ 3

よく考えつくなぁ。Haskell はバッククォートで 2 `plus` 3 みたいに書けるらしく、それにinspireされたと書いてありました。ところで ` って半年に二回くらいしか打たないので、 キー配列のどこにあるか未だに覚えられていないことに今気付く。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0