Здравствуйте, igna, Вы писали:
I>Здесь (2.6 Where’s My for Loop?) есть такой пример:
I>I>(defn indexed [coll] (map vector (iterate inc 0) coll))
I>(defn index-filter [pred coll]
I> (when pred
I> (for [[idx elt] (indexed coll) :when (pred elt)] idx)))
I>(defn index-of-any [pred coll]
I> (first (index-filter pred coll)))
I>
I>, определяюший функцию index-of-any являющуюся аналогом следующей функции на Java:
I>I>public static int indexOfAny(String str, char[] searchChars) {
I> if (isEmpty(str) || ArrayUtils.isEmpty(searchChars)) {
I> return -1;
I> }
I> for (int i = 0; i < str.length(); i++) {
I> char ch = str.charAt(i);
I> for (int j = 0; j < searchChars.length; j++) {
I> if (searchChars[j] == ch) {
I> return i;
I> }
I> }
I> }
I> return -1;
I>}
I>
I>В отличии от функции на Java ее аналог на Clojure в начале работы строит отображение индекс->значение. Это на самом деле нужно? Разве нельзя написать вот так?:
I>I>(defn index-of-any-helper [pred coll idx]
I> (when (and pred coll)
I> (if (pred (first coll))
I> idx
I> (recur (butfirst coll) (add idx 1)))))
I>(defn index-of-any [pred coll]
I> (index-of-any-helper pred coll 0))
I>
еще много вариантов есть:
;; clojure 1.2
(letfn [(pred [elt] (= elt \d))]
(first (remove nil?
(map-indexed #(when (pred %2) %1) "abcdef")))))
я думаю лучше писать короткие функции, которые можно использовать в других местах.