#n# とか #n=ナントカ とか

ちゃんとした説明を読んだことが無いので間違ってるかもしれない。この記法(?)のちゃんとした名前を、そんなものあるのかどうかも知らないけど、知らないのでどう調べていいのかわからない。"common-lisp #n#" とかでググっても # が無視されちゃうみたいだし。

n は任意の数字、10桁までやってみたけど使えるみたい。#n= と書いておくと、それ以降のコードで #n# と書いてある部分が に置換される。 が評価された結果ではなくて式そのもののままのカタチで出現する(のと同等)。置換されるのは macro 展開より前っぽい感じ(展開後でも同じ結果になるだけかも)。

(let* ((a 3)
       (#1=b (incf a)))
  (+ a #1#))
=> 8

(let* ((a 3)
       (b #1=(incf a)))
  (+ a #1#))
=> 9

上の場合は (+ a b)、下の場合は (+ a (incf a)) なので(というか、動作を見てる限りそれと同等の挙動をするので)違う結果になる。

追記: 単に source-text の置換では説明のつかない挙動を思い出した

(eq '(a b c) '(a b c))
=> nil

(eq #1='(a b c) #1#)
=> t

うーん。なんとなく理解はできるんだけど説明はできそうにない。