変数を含んだ文字列を作るときに、
(setf hoge 'apple)
(format nil "~a" hoge)
と書くことがあると思います。
個人的にはRubyのように
"#{hoge}"
とできたら嬉しいので
ライブラリを作成してみました。
初めに
Lispに関してはまだまだ初心者ですので、間違いがあればぜひご指摘ください。すごく喜びます。
convenience-string
convenience-string is provide {{}} operator in string. The variable inside the {{}} is evaluated.
文字列に{{}}
リテラルが含んでると、
リテラルに囲まれてる変数を評価してくれます。(*変数だけですので、(+ 1 2)などは展開できません。)
install
(asdf:load-system :convenience-string)
usage
{{}}
リテラルを使えるようにします。
(convenience-string:enable)
基本的な使い方は、
(setf hoge 'apple)
#S"this is an {{hoge}}"
;; => "this is an apple"
(let ((hoge 'apple))
(declare (special hoge))
#S"this is an {{hoge}}")
になります。
レキシカル変数はfind-symbolできなかったので、(declare (special hoge))
することで{{}}
内で参照することができます。
感想
自分のための忘備録です。
おもに躓いたとこ、疑問点をまとめています。
-
定数だけでなく式も評価できるようにすれば
良かったが、そうするとeval系を使わざる負えないと思ったので断念した。 -
文字列内で
{{}}
リテラルに囲まれている変数を抽出→シンボルにコンバート→symbol-value
で値を取得する以外に他に良いほうを見つけたい。 -
定義されたレキシカル変数のシンボルを見つける方法がわからなかった。(スコープとシンボルの理解が足りてないかも。)
参照・参考
リードマクロの作り方は
https://blog.3qe.us/entry/2018/11/13/023452
を参照しました。(すごくわかりやすかったです。)