2014-09-02 2 views
2

Итак, скажем, у меня есть этот абстрактный класс в Java с именем MyFunction, который имеет абстрактный метод оценки.Clojure, Java Interop и proxy-ed методы

Чтобы использовать это в Clojure, я могу сделать:

(def java-function 
(proxy [MyJavaFunction] [] 
    (evaluate [x] 
    (* x 2)))) 

И затем вызвать его:

(.evaluate java-function 3) 

возвращение

; => 6 

Что бы хороший способ превращения выше в чем-то более clojure:

(java-function 3) 

, что будет также возвращение

; => 6 

ответ

5

Вы можете добиться этого путем реализации интерфейса clojure.lang.IFn:

((proxy [clojure.lang.IFn] [] 
    (invoke [x] 
    (str "A very a nice x indeed: " x))) 
3) 
;= "A very a nice x indeed: 3" 

Чтобы иметь свой прокси подкласс MyFunction и реализации IFn, упомяните их как в первом аргумент для прокси; NB. класс идет первым:

(proxy [MyFunction clojure.lang.IFn] [] 
    ...) 

На самом деле выше реализация является неполным - вы также хотите реализовать applyTo метод, который принимает один аргумент НомерСтарта кроме this и используется apply. Существуют также отдельные методы invoke для других фиксированных явлений (до 20). Следуйте за this link источниками data.avl (выпуск 0.0.12), чтобы увидеть реализацию applyTo, делегируя соответствующий метод invoke, стараясь избегать перехода в бесконечный цикл/принимая чрезмерное количество времени, если пройденный seq происходит с быть бесконечным/очень длинным.

Смежные вопросы