Вопрос по – Обобщенный поток Threading макрос в Clojure

30

Примечание: это НЕ о параллелизме. Это о потоке макроса.

я знаю это-> ставит объект на 2-е место и->> ставит аргумент в последнюю позицию.

Теперь мне любопытно, так же, как обозначение короткой руки#( ... % ) для функций есть краткая запись для потоков, которая позволяет мне поместить аргумент вarbitrary место нахождения?

Цель состояла бы в том, чтобы вместо фиксированного расположения потока, через который я мог бы проходить ... я мог писать произвольные формы и вставлять %% в специальные места, а %% - это место, куда вставляется поток.

Спасибо!

Спасибо за вопрос. Я давно хотел спросить об этом. Иногда мне приходится использовать (# (func-adapter arg1% arg2)), чтобы получить нужный эффект - & gt; или - & gt; & gt ;. jbear

Ваш Ответ

4   ответа
34

так как 1.5 называетсякак- & GT;.

Этот твит дает пример того, как это работает:https://twitter.com/borkdude/status/302881431649128448

(as-> "/tmp" x
      (java.io.File. x)
      (file-seq x)
      (filter (memfn isDirectory) x)
      (count x))

Первый "х" связан с "/ tmp" и файл сделан из него. & APOS; х & APOS; снова возвращается к результирующему файлу и помещается через «file-seq»; функция и т. д.

Error: User Rate Limit Exceededgithub.com/…
Error: User Rate Limit Exceeded
2

которая обеспечивала эту функцию, но я забыл, где. Это могло бы быть в устаревшем clojure-contrib. Это было-$> макро.

Но вы могли бы извлечь его из ядра clojure- & GT; макрос сделать тот, который вы ищете:

(defmacro -$>
    ([x] x)
    ([x form] (if (seq? form)
                (with-meta (map #(if (= %1 '$) x %1) form) (meta form))
                (list form x)))
    ([x form & more] `(-$> (-$> ~x ~form) [email protected])))

И используйте $, чтобы указать точку вставки:

user=> (-$> 2 str (identity $) (println $))
2
nil

Технически, вы можете использовать несколько$ в одной форме. Но эта реализация страдает от многократного расширения одной и той же формы (в обмен на простоту).

26

Швейцарские стрелки библиотека сделает то, что вы просите:

(-<> 0
 (* <> 5)
 (vector 1 2 <> 3 4))
; => [1 2 0 3 4]

Тем не менее, это не то, что вам часто нужно (илиever в моем Clojure опыте)

Error: User Rate Limit Exceededas->Error: User Rate Limit Exceededanother answer.
Error: User Rate Limit Exceededas->Error: User Rate Limit ExceededmapError: User Rate Limit ExceededassocError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
15

если кто-то еще сталкивается с этим, есть причина, по которой предоставленные макросы существуют, а произвольное размещение - нет: последний приведет к плохому дизайну API.

-> макрос помещает аргумент в первую позицию. Это соответствует функциям, которые работают с некоторым предметным аргументом, например,conj, assoc.

->> макрос помещает аргумент в последнюю позицию. Это соответствует функциям, которые работают с последовательностями, например,map, reduce.

Хорошо спроектируйте свои API, и вам, скорее всего, не понадобится такой макрос.

nthError: User Rate Limit Exceeded
nthError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы