Для получения следующих данных:Clojure: построить функцию на основе переменных динамически?
(def occurrence-data '(["John" "Artesyn" 1 31.0] ["Mike" "FlexPower" 2 31.0] ["John" "Eaton" 1 31.0]))
Я хотел бы иметь функцию:
(defn visit-numbers
"Produce a map from coordinates to number of customer visits from occurrence records."
[coordinates occurrences]
(let [selector ??? ; a function that would be equivalent to (juxt #(nth % c1) #(nth % c2) ..), where c1, c2, ... are elements of coordinates
]
(group-by selector occurrences)
)
Например, для координат = [1 3]
Он должен быть
(group-by (juxt #(nth % 1) #(nth % 3)) occurrence-data)
Я думаю, что это должно быть возможно? Я попытался использовать выражение в списке, но пока не понял.
Мой эксперимент следующим образом:
(def selector (list 'juxt '#(nth % 1) '#(nth % 3)))
(group-by selector occurrence-data)
Got ошибка:
java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to clojure.lang.IFn
core.clj:6600 clojure.core/group-by[fn]
protocols.clj:143 clojure.core.protocols/fn
protocols.clj:19 clojure.core.protocols/fn[fn]
protocols.clj:31 clojure.core.protocols/seq-reduce
protocols.clj:48 clojure.core.protocols/fn
protocols.clj:13 clojure.core.protocols/fn[fn]
core.clj:6289 clojure.core/reduce
core.clj:6602 clojure.core/group-by
У меня есть две проблемы решить:
- Как сделать селектор функции?
- Как динамически строить такие координаты на основе функций?
Спасибо за ваши указатели и помогите!
Я также предполагаю, что использование макроса может также быть возможным?
Или я использую слишком сложный метод для достижения своей цели?
Я думаю, что OP смешивал функции и макросы. Вам не нужно цитировать тела функций. – DaoWen
Это имеет смысл, хороший момент! – YosemiteMark
Ваш ответ пропускает вторую часть вопроса OP: как * динамически * создавать такую функцию в зависимости от набора координат. Это тривиально сделать в Clojure, используя анонимную функцию, которая закрывается над координатами. – DaoWen