emacs-lispでは検索結果はグローバルな空間に格納されているらしい。検索結果を取り出す手続より前に別の検索をすると検索結果は上書きされる。実質的には途中に他の検索を行なわないと確実に信じられる状況というのは少ないのではないかと思った。例えばこんなコードを考えてみる。
(setq nnn (progn (re-search-forward "n*n") (a (match-string 0))))
一見して検索直後に結果を取り出しているように見える。ここで手続きAが本当に単なる関数なら問題はない。しかしAがマクロだとしたらどうだろう。その中で検索を行なってからmatch-stringを評価しうる。あるいは将来的にAがそのような仕様に変わりうる。それを踏まえて書き換えるならこんなところだろう。
(setq nnn (a (progn (re-search-forward "n*n") (match-string 0))))
普通はこれ以上にまでこだわる必要はないと思うけれど、prognがどこかで上書きされてないとも限らない。もちろん、このような特性を利用するテクニックは大いに活用されているけれども、私はハマったので念のためメモしておく。