不確定特異点

広く深く、ところどころ超深く

簡易的にコメントアウトする

コードの一部をコメントアウトしてプログラムの挙動を確認したい場合があります。コメントアウトするたびに真面目にコード編集していると面倒くさいので、C 言語だと #if 0#endifコメントアウトするステートメントを囲い、#if 0 にしたり #if 1 にすることで素早くコードを切り替えることをよくやります。

Common Lisp ではステートメントというよりも、S 式単位にコメントアウトしたいことが多いので、C 言語のように簡単に編集するのが難しいと思います。

たまたま HyperSpec の Syntax の章のマクロ文字の説明を読んでいたところ、#+コメントアウトに使えるかもと思いました。コード中の任意の場所で、#+test expression と書くと、test で与えられたシンボルが *features* に存在するならば expression がそのままリーダに読み込まれ、存在しない場合は expression は空白として扱われるようです。

test はシンボルだけでなく、feature 式という and/or/not を使った論理式も書けます。そこで、feature 式に nil を与えて #+nil とすれば、続く expression は空白に置き換わるはずです。

次のコードは declare で始まる S 式をコメントアウトすることになります。

(defun fib (n)
  #+nil (declare (optimize (speed 3) (debug 0) (safety 0))
           (type fixnum n))
  (if (< n 2)
      1
      (the fixnum (+ (fib (- n 1)) (fib (- n 2))))))

コメントアウトを止める場合は、#+ マクロ文字の逆の意味の #- を使って 、#+nil#-nil に変えるだけです。とてもお手軽です。

(defun fib (n)
  #-nil (declare (optimize (speed 3) (debug 0) (safety 0))
           (type fixnum n))
  (if (< n 2)
      1
      (the fixnum (+ (fib (- n 1)) (fib (- n 2))))))

#+nil で最適化しないで実行速度を計測し、#-nil で最適化を有効にして効果を見る、という例を挙げてみました。自分が知らなかっただけで、もしかしたら常套手段なのかな?本当はエディタで簡単にコメントアウトできればいいんですけど。