2016-01-24 3 views
1

Say Я хочу найти только первый матч состояния через ряд чисел, или в диапазоне:получает только первый матч с «doseq» в Clojure

(doseq [x (range 3 12) 
     :when (= 0 (mod x 4)) 
     ] 
    (println x) 
) 

Код напечатает all числа, которые делятся на в диапазоне от 3 до 11, так что это было бы 4 и 8, но что, если я просто хочу, чтобы первое совпадение было 4?

+2

'Код будет возвращать все номера ...' не это код возвращает 'nil', он печатает 4 и 8. Посмотрите функции clojure [filter] (https://clojuredocs.org/clojure.core/filter) и [сначала] (https://clojuredocs.org/clojure.core/first) – birdspider

+0

@birdspider мой плохой. Я редактировал вопрос. просто увидели ссылку 'first' и' filter'. Любите вас, человек. – Yar

+0

'doseq' всегда возвращает' nil', нет «первого совпадения», которое вы можете получить из [дозыq] (https://clojuredocs.org/clojure.core/doseq). – birdspider

ответ

3

Дозаq всегда возвращает нуль, нет «первого совпадения», которое вы можете получить от дозы.

Что вы можете сделать, это принять ваш (range 3 12) фильтр все те, которые удовлетворяют (= 0 (mod x 4)) от него, и, наконец, принести первый так:

(->> 
    (range 3 12) 
    (filter #(= 0 (mod % 4))) 
    first) 
; => 4 

; this is eqivalent to the above it you are unfamiliar with `->> 
; (first (filter #(= 0 (mod % 4)) (range 3 12))) 
Смежные вопросы