0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

リードマクロを使って文字列の変数を展開できるようにしてみた

Posted at

変数を含んだ文字列を作るときに、

  (setf hoge 'apple)
  (format nil "~a" hoge)

と書くことがあると思います。

個人的にはRubyのように


"#{hoge}"

とできたら嬉しいので
ライブラリを作成してみました。

初めに

Lispに関してはまだまだ初心者ですので、間違いがあればぜひご指摘ください。すごく喜びます。

convenience-string

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
を参照しました。(すごくわかりやすかったです。)

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?