CL-INTERPOL - String interpolation for Common Lisp

以前http://cadr.g.hatena.ne.jp/g000001/20080318/1205851335でちょっとふれてあった CL-INTERPOL 便利だ。
頭に #? は付けなければならないけど、正規表現中のバックスラッシュを重ねる手間がはぶけるし、変数や式の埋め込みもできる。
これが常に有効でもいいんじゃないだろうか。

(require :cl-interpol)
(require :cl-ppcre)

(cl-interpol:enable-interpol-syntax)

(cl-ppcre:do-register-groups (m)
    (#?/(\d+)/ "aa12ab34")
    (princ #?"match is [${m}]\n"))
;; match is [12]
;; match is [34]

(princ #?"(+ 1 2) => ${(+ 1 2)}\n")
;; (+ 1 2) => 3

ParenscriptjQuery を使って書こうと思ったけど、あのメソッドチェーンがエレガントに書けなかった。
CL-INTERPOL を使って、変数を埋め込みながら、素直に文字列で書くのがいい気がする。


cl-interpol:*outer-delimiters* にクォートキャラクタが入っているので、これに追加すれば任意の文字をクォート文字として使える。「」を使ってみる。
それに改行が途中にあっても大丈夫。

(pushnew '(#\「 . #\」) cl-interpol:*outer-delimiters* :test 'equal)

(princ #?「'a',
"a" \\b\\」)
;; 'a',
;; "a" \b\