2010-12-27

ちょっと気の利いた再帰の使い方

考えてみると当たり前なんだけど、軽く感動した再帰の使い方について。

ストリームか文字列を同じ引数として受け取る関数を書こうとして、ストリームの場合と文字列の場合の処理の振り分けについて考えていた。最初は単純に、typecaseや、cl-matchなどのパターンマッチャで、型ごとに分岐させるか、総称関数を使って、型ごとに関数を分けてしまおうと考えた。ただ、処理が、分岐や別の関数に散らばってしまうので、何となくしっくり来なかった。

そこで、他の人がどうやってるのかが気になって、使ってる処理系のコードを読んでみたところ、


(defun f (string-or-stream)
  (if (stringp string-or-stream)
      (with-input-from-string (s string-or-stream)
        (f s))
      (main-process)))

のようなアプローチを採っていた。賢い。

今後、こういうパターンでは使わせてもらおう。

0 件のコメント: