замыкающий оператор потоков - PullRequest
6 голосов
/ 20 октября 2011

Допустим, я хочу использовать оператор потоков, чтобы продвигать карту через серию вызовов функций.Все функции принимают карту как первый параметр (хорошо), но одна функция не соответствует правильной сигнатуре (скажем, она принимает карту как последний параметр).Каков наилучший способ «исправить» сигнатуру функции?

Ответы [ 3 ]

8 голосов
/ 20 октября 2011

Макрос читателя #() для функций анонимуса является хорошим кандидатом здесь:

(-> your-arg
  (fn1 arg2 arg3)
  (fn2 arg4 arg5)
  (#(fn3 arg6 arg7 %)) )

Он гибкий и добавляет мало визуального шума. Конечно, вы можете делать много разных вещей, в этом случае частичное применение функции также будет работать:

(-> your-arg
  (fn1 arg2 arg3)
  ((partial fn2 arg4 arg5)))

Существует также макрос ->>, который направляет первое выражение в последнюю позицию. Конечно, в вашем случае использования это не очень помогает, так как вам придется настроить некоторые вызовы функций. Однако если вы объединяете много функций, которые должны принимать выражение в качестве первого аргумента, а затем многие функции, которые принимают выражение в качестве последнего аргумента, вы можете сделать что-то вроде

(->>
  (-> your-arg
    (fn1 arg2 arg3)
    (fn2 arg5 arg6))
  (fn3 arg7 arg8)
  (fn4 arg10 arg11))

РЕДАКТИРОВАТЬ: Добавлены дополнительные скобки в первом примере.

6 голосов
/ 05 апреля 2017

Я думаю, что люди склонны недооценивать тот тип потоковых операторов, которые доступны в clojure.Итак, позвольте мне познакомить вас с оператором as-> threading.

Поток as-> создает переменную, которая принимает значение каждого вызова функции в шагах потоков.Например,

(as-> 2 x        ;; x = 2
      (+ 3 x)    ;; x = 5
      (- x 1)    ;; x = 4
      (/ x 2)    ;; x = 2
      (+ x x x)) ;; x = 6

Результат вышеприведенной операции равен x, то есть 6.

1 голос
/ 20 октября 2011
(-> your-arg
    (fn1 arg2 arg3)
    (fn2 arg5 arg6)
    (->> (fn3 arg7 arg8)
         (fn4 arg10 arg11)))

Мне кажется, лучше, чем версия с ->> "до" ->.Другая вещь, которую вы можете сделать, это написать некоторые базовые функции переупорядочения аргументов и использовать их для создания версий fn3 и fn4, которые принимают свои аргументы в нужном вам порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...