лучший способ повторно отобразить значения из последовательности в список аргументов? - PullRequest
3 голосов
/ 17 октября 2010

Извините за вопрос noob, но есть ли хороший способ деструктурировать значения из последовательности, подобной этой ...

(somefunc [[a b c] [1 2 3 4 5 6 7 8 9]] (prn a b c))

.. с помощью abc, которому присваиваются значения, пока последовательность не исчерпана и не позволяет мне вызыватьфункция на args?Doseq требует раздела правильного размера ..

(doseq [[a b c] (partition 3 [1 2 3 4 5 6 7 8 9])] (prn a b c))

Вывод:

1 2 3 4 5 6 7 8 9

Что делаетчто я хочу, но, похоже, должен быть способ сделать это простым способом без указания раздела.Я нашел решение с помощью loop / recur, но это намного больше кода и явно не идиоматично.Какой хороший способ сделать это?Спасибо!

Ответы [ 5 ]

4 голосов
/ 17 октября 2010
(defn apply-to-three [f [a b c & xs]]
  (f a b c)
  (when xs
    (recur f xs)))

user=> (apply-to-three prn [1 2 3 4 5 6 7 8 9])
1 2 3
4 5 6
7 8 9
nil
2 голосов
/ 18 октября 2010

Альтернативное решение более низкого уровня с использованием деструктуризации цикла:

user=> (def coll [1 2 3 4 5 6 7 8 9 10])
#'user/coll
user=> (loop [[a b c & more] coll]
user=*   (when a
user=*     (prn a b c)
user=*     (recur more)))
1 2 3
4 5 6
7 8 9
10 nil nil
nil

или используйте when c для выхода после последнего полного триплета.

2 голосов
/ 17 октября 2010
(defn some-func
  [[a b c & rest :as all]]
  (prn a b c)
  (prn rest)
  (prn all)

user> (some-func [1 2 3 4 5 6 7])
1 2 3
(4 5 6 7)
[1 2 3 4 5 6 7]

Подробнее о разрушении: http://java.ociweb.com/mark/clojure/article.html#Destructuring

0 голосов
/ 18 октября 2010

раздел + карта - все, что вам нужно. Читайте о Дорун, Дозак и Доалл: http://onclojure.com/2009/03/04/dorun-doseq-doall/

user> (dorun (map #(apply prn %) (partition 3 [1 2 3 4 5 6 7 8 9])))
1 2 3
4 5 6
7 8 9
nil
0 голосов
/ 18 октября 2010

Использование карты и раздела:

(map prn (partition 3 [1 2 3 4 5 6 7 8 9]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...