2016-02-21 2 views
3

Есть ли идиоматический/встроенный способ перевернуть порядок аргументов, который передается функции в Clojure?flip порядок переданных аргументов

Как я здесь с определением вспомогательной функции:

(defn flip [f & xs] 
    (apply f (reverse xs))) 


(vector 1 2)  ; [1 2] 
(flip vector 1 2) ; [2 1] 
+3

Да, есть! Вы написали это в своем вопросе. Я не совсем уверен, где это было бы полезно. Не могли бы вы привести практический пример? –

+0

Я работаю с 2d-вектором, скажем, сеткой с x и осью y. Тогда у меня есть функция, работающая на этой сетке: эта функция работает с непрерывной последовательностью полей в сетке, иногда вертикально, иногда горизонтально. Чтобы функция не беспокоилась о осях, я передаю ей (частичный вектор) или (частичный флип-вектор). через эту подфункцию функция может работать на сетке более абстрактным образом. –

+0

такой же эффект произошел бы, если бы я поменял оси x и y в сетке, когда мне это нужно. Mh, я не уверен, что это было хорошо объяснено ... –

ответ

3

Функция флип существует в других функциональных языках, но это достаточно легко сделать в Clojure, а также, и вы уже сделали Это!

Существует other способов сделать это.

И here - это обсуждение его из списка рассылки Clojure.

0

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

(defn flip [f] 
    (fn [& xs] 
    (apply f (reverse xs)))) 
1

Вы также можете использовать анонимную функцию инлайн повторно определить порядок аргументов.

(vector "a" "b")   ; ["a" "b"] 
(#(vector %2 %1) "a" "b") ; ["b" "a"] 
Смежные вопросы