Я не знаю, как правильно назвать свою проблему, так как я не знаю, как даже начать думать об этом, поэтому я изложу проблему.Представьте, что у меня есть несколько статических методов объекта Java, которые используют один и тот же синтаксис, например:
https://github.com/deeplearning4j/nd4j/blob/master/nd4j-backends/nd4j-api-parent/nd4j-api/src/main/java/org/nd4j/linalg/ops/transforms/Transforms.java
/**
* Floor function
*
* @param ndArray
* @return
*/
public static INDArray floor(INDArray ndArray, boolean dup) {
return exec(dup ? new Floor(ndArray.dup()) : new Floor(ndArray));
}
/**
* Signum function of this ndarray
*
* @param toSign
* @return
*/
public static INDArray sign(INDArray toSign, boolean dup) {
return exec(dup ? new Sign(toSign, toSign.dup()) : new Sign(toSign));
}
Итак, вот примерная пустышка:
(defn floor
^INDArray
[^INDArray a ^boolean dup]
(Transforms/floor a dup))
(defn sign
^INDArray
[^INDArray a ^boolean dup]
(Transforms/sign a dup))
Проблема здесь в том, что вы тратите время на написание функций с одинаковыми шаблонами, что нормально в первый раз ... но представьте, что вы хотите обновить ВСЕ из них в случае изменения / неработающего кода / настройки производительности / чего бы то ни было.
Я искал проблему, но ничего не нашел в ней.В идеальном случае (макрос?) Будет выглядеть так:
(defoperator floor Transforms/floor)
Или
(def floor (->operator Transforms/floor))
Я не знаю, можно ли вызвать "универсальный" статический метод для начинающихдаже если это довольно распространенный вариант использования и не нашел никакого ответа.Я подозреваю, что это не так, потому что ввод "Transforms / floor" в repl рассматривает его как статическое поле, а не как метод, но я не уверен.