ちょっと気の利いた再帰の使い方
考えてみると当たり前なんだけど、軽く感動した再帰の使い方について。
ストリームか文字列を同じ引数として受け取る関数を書こうとして、ストリームの場合と文字列の場合の処理の振り分けについて考えていた。最初は単純に、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 件のコメント:
コメントを投稿