Posted 2019-12-21 18:10:57 GMT
コメントをS式で書く方式のcomment
は、古くはMACLISPに、最近だとClojureにありますが、中身を無視してnil
(MACLISPだと'comment
)を返すシンプルなフォームです。
(comment 0 1 2)
→ nil
comment
の中身もS式として成立していないといけないのですが、動いているコードをコメントアウトする分には大抵問題になることはないでしょう。
Common Lispで書くとするとこんな感じになります。
(defmacro comment (&body body)
(declare (ignore body))
nil)
S式コメントには一つ問題があり、nil
等の値を残してしまうので、comment
を残す場所には配慮する必要があります。
(vector (list 42))
→ #((42)) (vector (comment (list 42)))
→ #(nil)
ここで一捻りして、nil
ではなく(values)
を置いてみるとどうでしょうか。
(defmacro comment (&body body)
(declare (ignore body))
'(values))
(values)
は0個の返り値を返しますが、Common Lispの場合は値が評価される場所ではnil
となります。
つまり、nil
と書いた場合と大差ないのですが、
(vector (comment (list 42)))
→ #(nil)
#.
を付けると、痕跡を消すことができます。
(vector #.(comment (list 42)))
→ #()
リーダーマクロの書法の一つとして、値を出力したくない場合は、(values)
を使うというのがあるのですが、これを利用した格好です。
#.(comment ...)
だとちょっと長いので、普段は、(comment ...)
で書き、必要になったら#.
を足す、という使い方をすれば、そこそこ便利に使えるかもしれません。
■
HTML generated by 3bmd in LispWorks 7.0.0