« 使いやすいハードウェア環境を目指して | メイン | 人のソースを読むと勉強になる »

次世代のデータ記述言語(かも!)JAXON
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

ひらっちです。

Webプログラミングではどのようなデータが送られてきても正常に動作するよう、入力データの検証が欠かせません。一方で、ユーザがフォームに入力したデータを、JavaScriptを使ってその場で検証して表示できれば、ユーザビリティの向上につながります。

この二つの機能は、データの検証についてはほんんど同じ機能です。しかし、多くの場合、サーバサイドではJavaScriptとは違う言語でプログラミングされているので、共通のコードにすることはできませんでした。

今回私が作成したものは、プログラミング言語に依存しないかたちで検証方法を書くためのライブラリです。まだ機能が絞り込まれていなかったり、足りなかったりしますが、一応動く形になりましたので公開します。

この機能を実現するため、最初はJSONを使っていました。しかし、JSONはある程度を超えた複雑な表現をしようとすると、見た目に煩雑になってしまいます。そこで、この機能を実現するために、まだ仕様が固まっていませんが、JAXON(Javascript Appliable Crosslanguage Object Notation)というデータ記述言語を考えてみました。

JSONが連想配列と配列でデータ構造をあらわすのに対して、JAXONでは関数呼び出しの形でデータ構造をあらわします。今回作成したデータ検証を例にとると:

Validate(input1(IsNumber('must be number')));

このような形です。

input1は、フォームのINPUT要素をあらわすオブジェクトです。 つまり、これは「input1が数値であることを検証する」と読めます(文字列はエラー時のメッセージです)。

また、Validate,input1はそれぞれ、可変長の引数をとります。複数の要素が指定された場合は、すべての要素の検証を行います。

JAXONによるデータ検証の記述は、大まかに次のようになります。

// 入力の記述
Input(入力名1);
Input(入力名2);
……

// 検証の記述
Validate(
    // 入力に対して、その引数の検証を行う
    入力名(動作(エラーメッセージ, 引数 ...)),
    // 第一引数の検証が真の場合、第二引数以降の検証を行う
    when( 入力名(動作(...)),
        入力名(動作(...))),
    ...);

JavaScript版のデモと、PHP版のデモが動くようにしておきました。ダウンロードはこちらです。ライセンスはMIT/Xスタイルです。

今回できなかった機能は、

  • 複数の入力の間の関係の検証
  • 配列型の入力の検証
  • JAXONの拡張のための簡単なインターフェイス

などです。

とくに、JAXONの拡張が容易になれば、Webアプリの多くの部分が親言語に依存しない形で書けるようになるんじゃないでしょうか。

トラックバック

このエントリーのトラックバックURL:
http://www.unoh.net/mt32/mt-tb.cgi/355

この一覧は、次のエントリーを参照しています: 次世代のデータ記述言語(かも!)JAXON:

» Plaggerでみんなのブックマークをアグリゲート from ARK-Web SandBox Wiki (PukiWiki/TrackBack 0.3)
スタッフが利用しているソーシャルブックマーク(SBM)のRSSを、plaggerを使って試験的にアグリゲートしています。 2006-10-16 Mo... [詳しくはこちら]

コメント

・・・もうちょっとがんばって、LISPテイストにしません?
「見た目LISPのコードだけどJavaScript上のインタプリタで動いてます」とか、「LISPデータを受信して、PHP上のLISPインタプリタで動作させる」とか。・・・XMLと大して変わらないか・・・?

コメントありがとうございます。

私はどちらかというとS式が好きなのですが、今回はあえてPrologや形式意味論っぽいものを指向してみました。
ただ、どちらも実際に使った経験が無いので「っぽい」域を出ていませんが……

また、JavaScriptでLispを動かすことは実際に可能です。ただ、そのような実装はすでにいくつかあるようです。また、データの検証という目的にとっては汎用の言語よりも、オブジェクト記述言語に特化した方がケアレスミスが少なくなると考えました。

コメントを投稿


画像の中に見える文字を入力してください。