JSON組み込み
JSONのようにデータの記述だけからなる言語の場合、パーサさえ書いてしまえば、それをcommon lispに組み込むことは容易だ。
例えば、『JSONデコード: トップダウン』で作成したJSONパーサを使った場合は、以下の4行だけで、common lispがJSONを解釈するように拡張することができる。
ただ、上記のパーサをそのまま適用した場合、JSON内で定数しか扱うことができないので、不便だ。
実際には、common lispの変数を扱えるように(及び必要なら、その他の)変更を加えた方が良いだろう。
(set-dispatch-macro-character #\# #\J (lambda (in _ __) (declare (ignore _ __)) `',(read-json in)))
これで、common lisp内でJSON表記が使えるようになった。
必要なのは、パース関数をマクロ文字に登録することだけだ。
例
> #J[1,2,3,false,5] --> (1 2 3 NIL 5) > #J[1,[2,[3.0],null],"abc\u0064efg",{"key":"value"}] --> (1 (2 (3.0) NIL) "abcdefg" ((:KEY . "value"))) > (mapcar #'car #J{"car":"cdr", "head":"tail", "first":"rest"}) --> (:CAR :HEAD :FIRST)
この、パーサの作成が言語の(シンタックスの)拡張に繋がるというのは、common lispの面白い特徴だと思う。
(そのためcommon lispでは、パーサの作成が、他の(多くの)言語に比べて特別な意味を持つ、と思う。)
最後に一つ。
JSONの記法をcommon lispに導入しても、あまり実用的な意義はないと思うが、エスケープ文字が使えるようになるのは便利だと思う。
> #J"abc\tdef\nghi" -->"abc def ghi"