ループの途中でreturn(break)したい

気が付いたら前回のポストからすでに2年弱。早いもんですね。。。。

Pythonでいうところの

objs = [{"a": 1, "text": "test 1 message"},
        {"a": 2, "text": "test 2 message"},
        {"a": 3, "text": "test 3 message"}]

for o in objs:
    if o["a"] == 3:
        return o

こんなことをClojureで実現したかったので考えてみたけど こんなのしか浮かばなかった。

user> (def objs [{:a 1 :text "test 1 message"}
                 {:a 2 :text "test 2 message"}
                 {:a 3 :text "test 3 message"}])
#'user/objs
user> (loop [o objs]
        (when-not (empty? o)
          (if (= 3 (-> o first :a)) ;; ここの3を変える
            (-> o first)
            (recur (rest o)))))

pythonで3行なんだし、もうちょっと縮められないかまた考えておこう。

それにしても、よくこんなことも知らずに今までやってこれてきたもんだ。

2018-04-03 追記

id:ayato0211 あやぴーさん曰く、この例程度であれば filter + first でも良いとのこと。

(first (filter #(= 3 (:a %)) objs))

やっぱ、clojure使ってる人はこっちの方がわかりやすかったりするのかな?

あと、reduce/reducedなんてのもあるらしい。

(reduce #(if (= (:a %2) 3) (reduced %2)) nil objs)

あやぴーさん、ありがとうございます。とても勉強になりました。 m(_ _)m