データが扱える人を探せ! 再考

データっていうか高階関数なら使えます - 日々ごちゃごちゃと考えるを読んで、map-canの使い方を知ったので試してみる。モジュールをみて勉強できるけど、こうやって書き比べをするのも参考になって有り難い。

(defun who-can-see (usrs abilities needs)
  (mapcan (lambda (usr ability)
            (and (subsetp needs (split-string ability #\SPC) :test 'string=)
                 (list usr)))
          usrs abilities))

ついでにsubsetpも用いて、かなりすっきりしたコードに。それぞれの定義を見に行くと、やってることは大して変わらなかったりするんだけど、標準で用意されている範囲くらいは使い回した方が処理を把握しやすくなるだろう。

「10分でコーディング」も

cadrグループの「10分でコーディング」やってみた - kozima の日記 - cadr group「10分でコーディング」を13分で - 'T - cadr groupで試していてためになる。カウンタ付きのloopとかarefとかmap-intoとか、こちらも自分の慣れてないものが出てきて新鮮だ。xyzzyのloopにはkeyがついていないけれど、doなら同じように出来るかな。あまり使う機会がないので動作確認。

(do ((i 1 (1+ i)))
    ((> i 3) (format t "der") 'hoge)
  (format t "~A " i))
| 1 2 3 der
| hoge

letとwhileを組み合わせたような感じだ。カウンタは分かりやすいけど、割とごちゃっとしてしまい、わざわざ使うありがたさが少ない気がする・・・。

追加れびゅ

15 分のもやってみた - kozima の日記 - cadr group


searchで出来そうではあるが、これだと"data1"みたいなのが"data101"とかで引っかかってしまうので、ちゃんと分けた方が良い。チェック用のデータも、実際に使いそうなものより、いじわるなものをいくつか用意した方が良いというのも感じた。