2011-07-06

string=の意外な利点

今まで、string=を使わずにequalで済ませていた。性能が要求される場面ではstring=の方が良いと思うけど(equalは汎用の比較関数なので、処理の振り分けの分だけどうしても遅くなる。ただ、型宣言をすれば、処理系によってはstring=と同じ処理に最適化されるかもしれない)、そんなコードなんて全然書かない。なので、すっかり存在を忘れていた今日この頃。Ron Garretユーティリティを読んでいたら、自分にとっては意外な利点を発見した。string=は文字列とシンボルの比較に便利。

ユーティリティの中にある、

(defun ignorevar? (v)
  (and (symbolp v) (string= v "_")))

というコードを読んで気付いたんだけど、string=に直接シンボルを渡している。あれ? と思ってHyperSpecを引いたら、渡すのはstring designatorで良いらしい。string designatorっていうのは、文字とシンボルと文字列のこと。

以前書いたマクロの中で、

(defun <-p (x)
  (equal (symbol-name x) "<-"))

っていうコードがあったんだけど、string=を使えば、

(defun <-p (x)
  (string= x "<-"))

こう、ちょっとだけ短く書けて、ちょっとだけ嬉しい。大きな違いはないんだけど、ささやかな幸せ、というか。

何にせよ、勉強になった。