読者です 読者をやめる 読者になる 読者になる

JSON組み込み

common lisp read macro

JSONのようにデータの記述だけからなる言語の場合、パーサさえ書いてしまえば、それをcommon lispに組み込むことは容易だ。

例えば、『JSONデコード: トップダウン』で作成したJSONパーサを使った場合は、以下の4行だけで、common lispJSONを解釈するように拡張することができる。
ただ、上記のパーサをそのまま適用した場合、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"