@node はじめに, 基本言語仕様, 履歴, Top
@chapter はじめに

インターネットのブラウザなどでは、HTML、XMLといったマークアップ言語をデータ表現の方法として使い、それを転送するプロトコルとしてHTTPが一般的である。しかし、XMLが発達するにつれて、データベースのクエリをXML形式で記述する方法が提案されるなど、XMLをデータ表現ではなく、プロトコルとしての性格の強い使われ方が成されるようになってきた。 
@sp 1
XMLがプロトコルとしての機能を充実すると、HTTPの役割はXMLで置き換えることが出来る。たとえば、HTTPのGET文は、....というXMLの構文で置き換えることが出来る。このように全てがXMLで置き換えられるようになると、パーザが二つから一つで十分になるなど、リソースの節約が期待される。しかし、単に構文を置き換えるだけでは、実行系は依然として二つ必要であるため、そのメリットはあまりない。 
@sp 1
たとえば、XMLでデータベースに検索クエリを出し、データを引き出したとする。 HTTPを使用した場合、GET文の中にXMLで定義された検索クエリがネストした形でデータベースに送り込まれる。しかし、検索クエリのセマンティックスはデータを GETするという意味はすでに含まれており、冗長性は避けられない。 
@sp 1
この問題の原因は、XMLの構文が統一されたにも関わらず、依然としてプロトコルとその上で処理されるデータという二つの概念が存在しいるからである。そこで、データとプロトコルという二つの概念が交換可能な言語XL(XML LISP)を提案する。つまり、 

@sp 1
@example
<greeting>Hello World</greeting>
@end example
@sp 1

@noindent
というXML表現があったとする。このgreeting というタグは、Hello Worldに付属した属性データであると解釈することもできるが、サーバがブラウザたいして「飾り立てて表示しろ」という指令するプロトコルとも取ることが出来、これらの解釈の違いを時と場合によって明示的にいろいろ変えることの出来る仕組みを提案する。 
@sp 1
プロトコルをプログラムと置き換えれば、プログラムとデータが交換可能で、プログラムをデータとして処理したり、データをプログラムとして実行したりすることの出来る言語として、LISP,MLなどの言語が存在する。XLでは、XMLの構文にLISPのセマンティックスを当てはめることによってXML構文の解釈をいろいろプログラムする仕組みを提供する。具体的には、XMLのタグをLISPの関数名、要素にネストした要素をLISPの関数の引数と解釈し、この関数の本体を定義する方法を導入する。たとえば、上述の例では、 

@sp 1
@lisp
(greeting "Hello World")
@end lisp
@sp 1

@noindent
というLISPのS式と同一であると解釈する。greeting という関数を定義すれば、この構文は実行可能となる。 
@sp 1
ところが、XMLの要素をLISPの関数と解釈したときに問題となるのは、関数の引数の評価方法の考え方がLISPでははっきりとしているが、XMLでは曖昧であるということである。この曖昧さには二種類ある。 
@sp 1
まず最初の曖昧さは、評価順序の曖昧さである。XML文書の要素の中の子要素は、アプリケーションの種類や、評価の状況などによって、必要な物だけが評価されるというNormal Orderの評価が行われる一方で、全ての物をきちっと評価される Applicative Orderの評価が行われる場合もある。 
@sp 1
次の曖昧さは、評価方法そのものの曖昧さである。要素の評価の仕方は、どのような要素のなかにネストされるかによって評価のされ方が違うという曖昧さがある。 
@sp 1
XML文書を処理するためには、まず関数定義の時に、引数の評価順序をNormal Orderか、Applicative Orderか明示的に選択できるようにすることによって、最初の曖昧さに対応する。次に、関数定義の時に、引数を評価するための専用の環境を明示的に指定することによって、要素がネストした場合の評価の方法を切り替えることが出来るようにする。
