Re: Пример из Programming Clojure
От: edbond Украина http://edbond.name
Дата: 19.08.10 19:00
Оценка:
Здравствуйте, 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")))))

я думаю лучше писать короткие функции, которые можно использовать в других местах.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.