<   2010年 12月 ( 28 )   > この月の画像一覧

jQuery デモ

jQuery デモ

CLEditor

WISYWIG のHTML エディタをインストールできるプラグインを使ってみた。ダウンロードサイトは http://premiumsoftware.net/cleditor/. body のテキストエリアを簡単にエディタに変身。このデモでは jquery.indent.js を使って、HTML 文書のソースを整形している。

markItUp!

body のテキストエリアをマークアップ補助のできるエディタに変えることができる jQuery のプラグイン。http://markitup.jaysalvat.com/home/ からダウンロード。チュートリアルのデフォールトの設定をしただけ。

jQuery HTML Editor

オリジナル。jQuery のコマンドを使ってDOM要素を操作できる。jQuery の学習用。プラグインではない。

Test Bed

オリジナル。jQuery をインストールしただけの白紙のページ、Google Chrome の JavaScript コンソールや FireBug でコントロールする。直接 body に記入することはできないが、jQuery で普通に書き込んでいけるので、ちょっとしたテストには便利。

付箋

オリジナル。jQuery UI の練習で作った。画面左上の付箋のテキストエリアにメモを書き込める。付箋の上の方のハンドルをドラッグすると位置を変えることができる。

プレゼンテーション

オリジナル。jQuery を使うとプレゼンテーションソフトの骨格を簡単に作ることができる。


jQuery のプラグインの導入は非常に簡単だ。ライブラリをインクルードして、操作したい対象の jQuery オブジェクトを作ってそれを初期化するだけだ。オープンソースのプラグインが多数あるのもうれしい。
[PR]
by tnomura9 | 2010-12-31 16:22 | jQuery デモ | Comments(0)

CLEditor デモ

WISYWIG の HTML エディタが作れる jQuery のプラグイン、CLEditor のデモをインストールしてみた。テーブル作成のプラグインもインストールしてある。

また、HTML 文書の表示のときに、jquery.indent-1.2.js を利用した。jquery.cleditor.js の一部を書き換えたので、(と言っても、updateTextArea の var html = $(editor.doc.body).html() をvar html = $(editor.doc.body).indent({tab: "    "}) に置き換えただけ。一応元本と紛れないようにファイル名を、jquery.cleditor.indent.js に変更した。

プラグインを組み合わせるだけで簡単にカスタマイズできるのが、jQuery のすごいところだ。
[PR]
by tnomura9 | 2010-12-31 16:14 | JavaScript | Comments(0)

jQuery HTML Editor

jQuery のコマンドで HTML 文書を作る『jQuery HTML Editor』というページを作った。 jQuery の参考書を読んでセレクターの実験をやってみたが、いちいちファイルを作成するのが面倒になったからだ。body 内にスクリプトを入れても無視されてしまうが、大抵のセレクターや jQuery コマンドの実験はできる。Google Chrome の JavaScript コンソールや、FireBug から使うと便利だ。

ページ先頭の jQuery: テキストフィールドに jQuery のDOM要素を操作するコマンドを次のように入力し、

$s('body').append('<h1>hello</h1>')

[exec cmd] ボタンをクリックすると、スクリーンに hello というヘッダーが追加される。$s() 関数は、このエディター特有の関数で、jQuery の $() 関数に相当する。HTML文書がこのエディターでは、<iframe id="screen"></iframe> に収められるため、$()関数ではなく $s() 関数を使うことになる。$s() 関数の定義は次のようになる。

$s = function(selector) { return $('#screen').contents().find(selector) };

$s() を使えは、$() 関数とほぼ同じ操作でスクリーンのDOMオブジェクトを操作することができる。例えば、

$s('h1').text('How ara you?')

は、H1ヘッダーの文字列を hello から How are you? に変えることができる。[sc / txt] ボタンをクリックすると、HTML文書の表示がレンダリングされているものとソース表示とを切り替える事ができる。ソース表示の時も編集可能で、編集後に [sc / txt] ボタンをクリックすると編集が反映される。

Google Chrome でこのサイトをアクセスしている場合は、Shift + Ctrl + J で JavaScript コンソールを起動すれば、コマンドラインからスクリーンの操作をすることができる。この場合もスクリーンの操作をする場合は $() 関数ではなく、$s() 関数を使わなくてはならない。

HTML文書の表示には jquery.indent.js という jQuery のプラグインを利用させていただいた。

トイ・プログラムだが、jQuery のコマンドとHTMLの関係を学習するのには便利だ。

jQuery のコマンドでHTML文書を作るのは面倒なようだが、<li> 要素や、<option> 要素のように同じパターンを繰り返す場合は、jQuery の機能を使ったほうが楽だ。例えば次のようにして、<ul> 要素の中の <li> 要素も一気に作ることができる。

$s('body').append('<ul></ul>')
["item 1", "item 2", "item 3", "item 4"].map(function(elem){ $s('ul').append('<li>' +elem+ '</li>') })

また、つぎのように、<li> 要素だけを一気に削除することもできる。

$s('li').remove()

また、id に "2_3" のようなセルの位置のインデックスをつけた表のようなものも次のようなコマンドで作成できる。

$s('body').append('<table border></table>');
for (i=1; i<6; i++) { $s('table').append('<tr></tr>'); for (j=1; j < 6; j++) { $('tr:last-child').append('<td id="'+i+'_'+j+'">cell('+i+','+j+')</td>') }; };
$s('body').append($s('#3_4').text());

jQuery の勉強のつもりで、このエディターを使っているうちに、HTML文書自体の作成の効率化にも jQuery を利用したいと感じるようになるだろう。

jQuery HTML Editor はフリーウエアです。
[PR]
by tnomura9 | 2010-12-25 21:56 | JavaScript | Comments(0)

jQueryの文法

jQuery の本を買った。『Web制作の現場で使う jQueryデザイン入門』 西畑一馬著だ。jQueryを現場で使うためのノウハウが、論理的な章立てですっきりと解説してある。非常に分かりやすい。サンプルもダウンロードできる。

しかし、自分で入力してその反応を見てみないと、納得した感じがしない。といっても、サンプルをいちいちエディターで文書ファイルにするのも面倒だ。本を読んでみたら、jQueryは、DOM要素の編集もできるようだったので、jQuery をインポートしただけの白紙のページを作ってみた。http.www.mnet.ne.jp/~tnomura/testbed.html がそれだ。Google Chrome で使うと便利だ。アクセスしても白紙のままだが、Shift + Ctrl + J で JavaScript コンソールを立ち上げて、コマンドラインに、

$("body").append("<h1>hello, world</h1>");

と入力すると、hello, world という文字が現れる。作業の結果を保存したいときは、[名前をつけて保存する]メニューで保存できる。ただし、JavaScriptはブラウザーから読み込まないと動かないので、Apacheのパスの通ったフォルダーにいれておく必要がある。

前置きが長くなったが、jQuery の命令は例外なく次の形を取る。

$( selector ). method( args );

$( selector ) の部分が、selector で指定したオブジェクトを取得する部分で、method( args ) が、そのオブジェクトを操作する命令だ。したがって,selector の書式を覚え、メソッドの作用を覚えるだけで、様々なDOM要素に対する操作を行うことができる。selector の書式も css セレクタの書式に準じているので、スタイルシートを扱っている人なら改めて学習する必要もないくらいだ。この、余計なことを覚えなくて済むシンプルさが jQuery の人気のひとつなのだろう。

このシンプルさは、jQuery のプラグインを使うときも同じだ。例えば、テーブルをソートするプラグインは、jQuery の初期化を行う次のプログラムの中で、tablesorter() メソッドを実行するだけだ。

$(function() {
  $("#myTable").tablesorter();
});

JQuery を紹介したページは多くあるし、本を買ったほうが学習曲線の上がり方が速いのでこのブログでの jQuery ねたは終わるが、JavaScript にも素敵なライブラリが出現した。もっとも、jQuery 自体が、習得が容易で機能の多彩な新しいネットワークプログラミング言語であると言えるのかもしれないが。

付録: testbed.html の操作例

$("body").append("<h1>header 1</h1>")
$("body").append("<ul></ul>")
["item 1","item 2", "item 3", "item 4"].map(function(elem) { $('ul').append("<li>"+elem+"</li>") })
a = ["first", "second", "third", "fourth"]
$('li').each(function(i){ $(this).attr("id", a[i]) })
$.each(["red","yellow","green","blue"], function(i, elem) { $('li:nth-child('+(i+1)+')').css('color', elem) })
$("h1").text("text changed")
$("li:first-child").text($("h1").text())
[PR]
by tnomura9 | 2010-12-23 10:35 | JavaScript | Comments(0)

クロージャー

jQuery のソースコードの冒頭で、コンストラクタ jQuery(selector, context) を定義するのに、わざわざ、無名関数を実行して、その戻り値の関数で定義していたので不思議に思ったが、いろいろ調べていたら、これはクロージャーを作るための普通のテクニックだった。

クロージャーを説明するほど、はっきりとは理解していないので、Wikipedia のクロージャーの記事を読んでほしいが、要するに関数の中で関数を定義し、それを戻り値にして戻してやると、最初の関数で定義された局所変数が、戻り値の関数の中に保存されるという仕組みらしい。この局所変数をレキシカル変数というが、最初の関数が実行された時点で消滅するので、名前空間を汚さないが、戻り値の関数の中ではしっかりと保存されている。

たとえば、クロージャー counter() を作る newCounter() という関数を次のように定義すると、

function newCounter() { var i = 0; return function() { i = i + 1; return i } }

この newCounter() を使って定義されたつぎのような counter() は呼び出される度に値をインクリメントする。

counter = newCounter()

counter() => 1
counter() => 2
...

jQurey の定義の際に無名関数のなかで定義された局所変数は、無名関数が実行されるとともに消滅するので名前空間を汚さないが、コンストラクタ jQurey の中ではちゃんと保存されており、jQuery の呼び出しの度に機能を発揮するので別に問題は起こらない。

このような jQuery のレキシカル変数の大半は、正規表現が代入されており、それも、init メソッドの中に集中している。したがって、これらのレキシカル変数が jQuery の引数である、selector と context の構文解析に使用されていることが分かる。jQuery は様々な selector の表現に対応しているが、その表現の解析は、jQuery オブジェクトの init メソッドの中で行われていたわけだ。

また、上で述べたクロージャーの例を見ると、呼び出す度に値が変わる関数を定義することができる。これを利用すれば、遅延評価を JavaScript で実行させることができるかもしれない。JavaScript と関数型言語の距離は思っているよりも近いのかもしれない。そのため、jQuery のような、for 文のない関数型言語のようなライブラリを記述できるのだろう。

Haskell は理論的な言語で実用には使えないという意見を見ることが多いが、手続き型言語と思われていた JavaScript にしっかりと関数型言語の手法が取り入れられていた。やはり、これからのプログラミングには関数型言語の知識が必須となっていくのだろう。
[PR]
by tnomura9 | 2010-12-21 08:19 | JavaScript | Comments(0)

jQuery のセレクター

jQurey の命令は基本的に、$( セレクター文字列 ).method( メソッドの引数 ) という形になる。たとえば、h1要素の文字を赤くするには、

$('h1').css('color', 'red')

とすればよい。

jQuery では、セレクター文字列にCSSセレクターに類似した、式を入力することで様々なDOM要素の検索をしてくれる。

jQurey のコマンドをテストするページを作ったので、そこをアクセスして、テキストフィールドに用例をコピーしてリターンキーを押して動作を確かめてほしい。

タグ名で検索するときは、$('h1')、$('ul') のようにタグの文字列を引数にする。また、最初の子要素にアクセスするときは、$('ul' :first-child') と記述する。3番目の子要素の場合は、$('ul :nth-child(3)') のように記述する。その他様々な検索方法があるようだ。

セレクターの検索文の書き方を覚えると、jQuery を使いこなせるような気になってくる。

$( selector ) の selector はどうもその概念をCSSセレクターから借りてきたようだ。DOM要素の取得は JavaScript 標準のものより、CSSセレクタを使った方が記載しやすい。AllAbout の jQueryのセレクタ基本にはCSSのさまざまな記述方法の解説がされている。

また、jQuery 本家の文書にも Selectors についての詳しい説明がある。本家なので当然英語だが、各項目についてサンプルスクリプトとデモが例示してあるので、そこだけを見ても参考になる。
[PR]
by tnomura9 | 2010-12-19 22:32 | JavaScript | Comments(0)

jQuery のソース

前回のエントリーで、jQuery のオブジェクトを、Google Chrome の JavaScript コンソールから動かしてみることができるのが分かったので、jQureyのソースが読みやすくなった。

前々回も見たとおり、jQuery の冒頭では、var jQuery = (function () { ... }) (); という17ページにも及ぶ長大な無名関数が実行される。なぜこのような無名関数の実行という形を取ったのかというと、作業用の変数や関数は var 宣言しておけば、無名関数の終了と共に消滅する。余計な作業用の変数をコードに残さないための工夫だ。

jQuery を実際にコンソールから、テストしてみた感触と照らし合わせて、この関数が、jQuery の心臓部とも言うべき、jQuery クラスを定義している部分だということが分かった。細部を省略したこの部分の記述は次のようになる。

var jQuery = (function () {
  var jQuery = function( selector, context ) {
  return new jQuery.fn.init( selector, context )
  },
  _jQuery, _$, rootjQuery, ... (以下省略)

  jQuery.fn = jQuery.prototype = {

    init: function( selector, context) { .. },
    selector: "",
    jquery: "1.4.4",
    length: 0,
    size: finciton() {..},
    toArry: funciton() {..}
    get: function( num ) { .. },
    pushStack: function (elems, name, selector ) { .. },
    each: function(fn) { .. },
    ready: function( fn ) { .. },
    eq: function( i ) { .. },
    first: function() { .. },
    last: function() { .. },
    slice: function() { .. },
    map: funciton() { .. },
    end: function(9 { .. },
    push: push,
    sort: [].sort,
    splice: [].splice

  };

  jQuery.fn.init.prototype = jQuery.fn;

  jQuery.extend = jQuery.fn.extend = function() { .. ; return target; };

  jQuery.extend({
    nonConflict: function( deep ) { .. ; return jQuery },
    isReady: false,
    readyWait: 1,
    ready: function( wait ) { .. },
    bindReady: function() { .. },
    isFunction: function( obj ) { .. };
    isArray: Array.isArray || function( obj ) { .. },
    isWindow: function( obj ) { .. },
    isNaN: function( obj ) { .. },
    type: function( obj ) { .. },
    isPlainObject: function( obj ) { .. },
    isEmptyObject: function( obj ) { .. },
    error: function( msg ) { .. },
    parseJSON: function( data ) { .. },
    noop: function() {},
    globalEval: function( data ) { .. },
    nodeName: function( elem, name ) { .. },
    each: function( object, callback, args ) { .. },
    trim: trim ? function( text ) { .. } : function( text ) { .. },
    makeArray: function( array, results ) { .. },
    inArray: function( elem, array ) { .. },
    merge: funciton( first, second ) { .. },
    grep: function( elems, callback, inv ) { .. },
    map: function( elems, callback, arg ) { .. },
    guid: 1,
    proxy: function( fn, proxy, thisObject ) { .. },
    access: function( elems, key, value, exec, fn, pass ) { .. },
    now: function() { .. },
    browser: {}

  });

  jQuery.each( .. );
  browserMatch = jQuery.uaMatch( userAgent );
  if ( browserMatch.browser ) { .. }
  if ( jQuery.browser.webkit ) { .. }
  if ( indexOf ) { .. },
  if ( !rwhite.text ("\xA0") ) { .. }
  rootjQuery = jQuery(docu_ment);
  if ( docu_ment.addEventListner ) { .. }
  else if ( docu_ment.attachEvent ) { .. }
  function doScrollCeck() { .. };

  // Expose jQuery to the global object
  return (window.jQuery = window.$ = jQuery);

}) ();

無名関数の内部の構成は次のようになっている。

1. var 宣言による局所変数の宣言

局所変数は無名関数の実行が終了したら失われるので、作業用の変数と考えて良い。したがって、上の記述では大部分を省略した。

2. jQuery クラスのプロパティやメソッドのプロトタイプ宣言

jQuery.jn = jQuery.prototype { .. } の部分。

3. jQuery.fn の別名を jQurery.fn.init.prototype で作る。

4. jQuery.extend 静的メソッドの定義。おそらく、jQueryクラスの拡張を引き受ける。引数は、プロパティや、メソッドをまとめたオブジェクトだ。

5. jQuery.extent メソッドを実際に使って、jQuery クラスの機能を拡張する。

以後も同じ手法が使われ、jQuery の基本クラスにプロパティやメソッドを付け加える形で、基本クラスが拡張されているようだ。この手法だと、クラスの全てを書き直す必要がないので、機能の追加のコーディングやテストが楽になるのだろう。

6. jQuery.each 以下でその他の必要な処理が実行されているが今のところ機能は分からなかった。

7. 無名関数の戻値を return 命令で戻す。

戻値は、window.jQuery = window.$ = jQuery だ。

上の構成で目につくのは、最初の

  var jQuery = function( selector, context ) {
  return new jQuery.fn.init( selector, context )
  },

の部分だ。jQueryはクラスだが、JavaScirpt コンソールでテストするときは、特にインスタンスを生成している部分はなく、$(docu_ment.body) でインスタンスが発生する。上の記述をみると、内部的に new 命令でインスタンスを発生しているが、それを関数でラッピングしているため、$(docu_ment.body) の様に、連想配列のような書き方ができる。

つぎに、注目したのは、無名関数の戻値だ。戻値がクラスのコンストラクタであることは検討がつくが、

window.jQuery = window.$ = jQuery

のように3つの別名がある。これを、JavaScript コンソールで実験してみた。まず最初に、背景色を赤に変えた。
$(docu_ment.body).css('backgroundColor', 'red')

次に、次のような記述で青色に変えた。
jQuery(docu_ment.body).css('backgroundColor', 'blue')

最後に、次の記述で白に戻した。
window.jQuery(docu_ment.body).css('backgroundColor', 'white')

$(docu_ment.body) がDOM要素に対応するjQuery のオブジェクトであることが分かったので、上の定義で現れた、プロパティを試してみた。
$(docu_ment.body).jquery
"1.4.4"

$(docu_ment.body).context
​…​​

これで、jQuery の魔法の内容が少し分かってきた。$(DOM要素) で指定したDOM要素に対応する jQuery オブジェクトをつくり、それにメソッドで通信することで、ブラウザを制御することができる。jQueryのメソッドは、戻値にjQuery のメソッドを返すようにしているので、ドット記法で処理を連結していくことができる。jQuery の秘密は、DOM要素やそのリストをラッピングする、jQuery オブジェクトを作ることで、DOM要素を直接に扱うよりも統一的な操作で、DOM要素のプログラミングができるようになっているのだ。

また、配列の操作に関すうるメソッドでは、関数型言語の配列操作の処理に似せてあるため、for 文を一切使わないで、複数のDOM要素の処理や、繰り返しの処理ができるようにしている。

jQuery はDOM要素を、jQurey オブジェクトで包み込む事によって、簡潔で直感的な操作をできるようにした、DSL(Domain-Specific Language) なのだ。
[PR]
by tnomura9 | 2010-12-19 10:23 | JavaScript | Comments(0)

jQuery を使ってみた。

jQuery のソースを覗き込んでいたが、このライブラリーをどういう風に使うのか知らなかった。そこで、圧縮版のファイルをダウンロードしてきて、apache のドキュメントルート下のディレクトリに置き、jquery.js にリネームした。同じディレクトリに次のような簡単なHTML文書を作った。script タグで jquery.js を読み込むようにしただけで、後は単純なHTML文書だ。

<!doctype html>
<html>
<head>
<title>Test Page</title>
<script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<h1>Hello, World</h1>
</body>
</html>

これを、Google Chrome アクセスし、Shift + Ctrl + J で、JavaScript コンソールを表示した。そうして、コマンドラインから、

$(docu_ment.body).css('backgroundColor', 'green')

と入力したら、あら不思議、背景色が緑色になってしまった。次に、

$(docu_ment.body).css('color', 'yellow').css('backgroundColor', 'red')

にしたら、レゴみたいな派手な色使いに変わった。

要するに$() でDOM要素を検索してそれに関連するjQuery オブジェクトをインスタンス化して、そのオブジェクトにメッセージを送ると、DOM要素を操作できるらしい。なんと簡単なのだろう。Haskell から JavaScript に移っても興奮しっ放しだ。こんな魔法をどうやって実現しているのかぜひ知りたいが、A4版110頁は負担が重い。
[PR]
by tnomura9 | 2010-12-18 21:58 | JavaScript | Comments(0)

あっと驚く JavaScript の書き方

jQuery のソースを解読中だ。解読と言ってもDOMもCSSもAjaxもあまり良く知らないので、どこまで読めるか全く自身がないが、へー!!を連発しながら読んでいる。そのなかでも、あっと驚く書き方にぶつかったので思いつくままに書いてみる。

その1 関数の引数は関数の定義の際に指定しなくても、後で argments で取得できる。

次のような関数が動いてしまうのだ。Google や FireBug の JavaScript コンソールで確認できる。

test = function() { return arguments[0] }
test("hello")
"hello"

test = function() { return arguments.length }
test(1,2,3)
3

test = function() { return sum(arguments) }
test(1,2,3)
6

その2 クラスの名前は小文字でも良い。

hello = function() {}
hello.prototype.show = function() { return "hi, there" }
hi = new hello
hi.show()
"hi, there"

その3 window オブジェクトに勝手にメソッドを付け加えることができる。

window.al_ert( "hello" ) でアラートが表示されるが、

window.mymethod = function() {return "konnichiwa!"}

もちゃんと動く。

window.mymethod()
"konnichiwa!"

その4 変数名に$記号を使ってもよい。

$area、area$、are$a のどれも変数名として受け入れられる。

本当に驚いた。JavaScript はなんでもありの世界だ。
[PR]
by tnomura9 | 2010-12-18 18:14 | JavaScript | Comments(0)

無名連想配列の作り方

JavaScript ライブラリーの中で、jQuery はライブラリ本体のコンパクトさと、ライブラリを使った記述が非常にコンパクトになるという際立った特徴があるらしい。特に特徴的なのは、jQueryオブジェクトの処理を、ドット記法を連ねることで連結させることができるということだ。

もしかしたら、jQueryには、Rubyのアイディアや、関数言語のアイディアが盛り込まれているかもしれないと思い、ソースをダウンロードした。プリントアウトしたらA4版で110ページもある。げんなりしたが、さっと目を通したら、each や map など、見慣れた単語が出てきた。関数言語臭い。また、match などの単語も見られるので、DOMオブジェクトをパースしてjQuery オブジェクトにしてから処理をしているのではないかと思った。それなら、パーサーのテクニックも学べる。ますます、興味が湧いてきた。

ところが、冒頭から

var jQuery = (fuction () {
  var jQuery = ..

という表現が現れてびっくりした。 (function () { .. }) () というのは無名関数を無名関数のまま実行するときの記述だ。記述をまとめるために無名関数でカプセル化しているのだろうかとも思ったが、そのあとすぐに、var jQurey という表現が出てきてさらに驚いた。関数の中でvar 表現を使うときは、その変数を局所変数にして隠蔽する場合に使う。なんで、そのようなことをするのだろうか。

しばらく考えていたら、局所変数が隠蔽できるのなら、無名連想配列が作れるかもしれないと思いついた。連想配列は、普通、a["apple"] = "red" のような記述をしなくてはならないので、["apple", "red"] のような無名配列が記述できない。しかし変数 a が隠蔽出来れば、無名配列ができるかもしれない。そこで、次のプログラムを実験してみたら動いた。

b = (function () { var a = []; a["apple"] = "red"; return a }) ()
[]

b["apple"]
"red"

a["apple"]
ReferenceError: a is not defined

そうすると、前回のエントリーで作った、リストから連想配列を作る関数も、グローバル変数を使わないで、関数に作ることができる。そうすれば、副作用が発生しなくなるので嬉しい。(Haskell on JavaScript で試せる)

b = (function () { var a = []; zipWith(function(x,y){a[x]=y}, ["apple", "lemon"], ["red", "yellow"]); return a }) ()
[]

b["lemon"]
"yellow"

a
ReferenceError: a is not defined

なんか、わくわくしてきた。JavaScript はそっけない言語だ。基本的な機能だけ提供してあまりユーザの面倒は見てくれない。それだけに、アセンブラのような自由さがある。いろいろなトリッキーな工夫をしても、普通に動いてくれる。jQuery も一種のDSL(Domain Specific Language)だ。このようなものも簡単に記述できるところが、JavaScript の魅力だ。

これを見ていると、未来の言語仕様がみえてくるような気がする。つまり、オブジェクト指向や、高階関数や、正規表現や、パーサーの部品や、イベントリスナーなどの高機能だが基本的な機能だけを提供し、あとはなにもしない簡潔な言語だ。ユーザはそれを使って、DSLを簡単に作成することができる。

そのような言語を待つのもよいが、JavaScript 活用のテクニックを整理すれば、十分にDSL言語のアセンブラとして使えるのではないかという気がしてきた。
[PR]
by tnomura9 | 2010-12-18 05:53 | JavaScript | Comments(0)