言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

メール、ファイル共有、プレゼンテーションについてのメモ3

週末に考えた事をメモ

ハッシュキーを URL にして構築されたハイパーテキスト世界の特徴は全てが静的だという事だ。ハッシュキーはある文書の特定のバージョンに対して付けられる。だから一旦文書にハッシュキーを付けると、文書に付けられたリンクの先も決まっている。という事は、この世界では一旦 URL を取得すると、その文書だけではなく、そこから辿れる世界の全体が決定されている事になる。

この世界で、動的なウェブサービスを実現するには何が必要だろうか? (実用的にはこんな事を考える必要は無いけど、思考実験としては面白い。)

この問題は、関数型言語での副作用の扱いと似ている。だから、同じ解決策が使えるだろう。

関数型言語で動的な振る舞いを記述する一番原始的な方法は無限リストを使う事だろう。リストは関数から作られるので、ハイパーテキストに関数的な物があれば静的ハイパーテキストの世界で動的な振る舞いを記述出来る。関数に必要な物は仮引数で内容を置き換えるという抽象化の仕組みだが、xlink の仕様に拡張リンクという面白い物があって、このアイデアを流用出来そうだ。単純な例を挙げると、

<paragraph xlink:type="extended">
 <value xlink:type="locator" xlink:label="somelink" xlink:href="http://metatoys.org"/>
 <jump xlink:type="resource" xlink:label="somelink">どこかにジャンプ</jump>
</paragraph>

ここでは、xlink:type="locator" で somelink というラベルに "http://metatoys.org" を代入すると、somelink を http://metatoys.org の代わりに使う事が出来る。この somelink の定義は文書の外に書く事も出来るので、関数に引数を適用するように、文書の中に未決定の URL を仕込んでおいて後から「適用」し、新しい文書を作る事が出来る。ちょっとこのままじゃ文法がうるさいので次のような例を考える。

<cons>
  <head>
    <define label="head"/> <!-- 仮引数 head の宣言 -->
    <define label="tail"/> <!-- 仮引数 tail の宣言 -->
  </head>
  <body>
    <pair>
      <link id="head" label="head" show="embed"/> <!-- head を埋込む -->
      <link id="tail" label="tail" show="embed"/> <!-- head を埋込む -->
    </pair>
  </body>
</cons>

<car>
  <head>
    <define label="pair"/> <!-- 仮引数 pair の宣言 -->
  </head>
  <body>
    <link label="pair#tail" show="embed"/> <!-- pair 内の tail 要素を埋込む -->
  </body>
</car>

ここでは架空の XML 文で lisp にある cons と car を実装してみたつもりだけど、このようにして必要な部品を作って行けば静的なハイパーリンクの仕組みでダイナミックなウェブを実現可能だろう。

ふとここで、これってテンプレートに似ているなと思って、XML でテンプレートと言うとすでに XSL があるじゃないかと思い考察を止めたのでした。また残念ながら、文書記述言語を関数が記述出来るほど強力にしてしまうと、Principle of Least Power に反してしまうので、筋の良いデザインでは無いです。