2016-10-26 8 views
1

Как настроить методы вызовов в Clojure?Unquote java method in clojure

Пример:

(def url (java.net.URL. "http://www.google.com")) 
(.getHost url) ;; works! 
(def host '.getHost) 
(host url) ;; Nope :(
(~host url) ;; Nope :(
(eval `(~host url)) ;; Works :s 
+1

Поскольку '' .getHost' не является «цитируемым методом» для начала, вы не можете его исключить. Это просто символ. Кроме того, вы, похоже, уже разработали способ оценки вашего символа в вызове метода, так что в чем вопрос? –

+0

Эта последняя строка испугала меня хорошо! Счастливого Хэллоуина! –

ответ

0

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

> (ns clj (:import [java.net URL])) 
> (def url (URL. "http://www.google.com")) 
> (defn host [arg] (.getHost arg)) 
> (host url) 
;=> "www.google.com" 

В то время как вы могли бы использовать memfn как указывает другому пользователю, кажется менее очевидным, что происходит. В самом деле, даже clojure.org теперь рекомендует против него:


https://clojure.org/reference/java_interop

(memfn method-name arg-names)*

Macro. Расширяется в код, который создает fn, который ожидает , передает объект и любые аргументы и вызывает метод именованного экземпляра на объект, передающий аргументы. Используйте, если хотите обработать Java-метод как первоклассный fn.

(map (memfn charAt i) ["fred" "ethel" "lucy"] [1 2 3]) 
-> (\r \h \y) 

Примечание почти всегда предпочтительнее делать это прямо сейчас, с синтаксисом, как:

(map #(.charAt %1 %2) ["fred" "ethel" "lucy"] [1 2 3]) 
-> (\r \h \y) 
-1

Использование memfn:

(def url (java.net.URL. "http://www.google.com")) 
(def host (memfn getHost)) 
(host url) 
+0

Я забыл о 'memfn'. –

+0

memfn был лишен в эпоху Clojure 1.0. Он был заменен # (.namename thing args args) form –

+0

Источник для этого Артура? – ClojureMostly

0

Обычный способ параметризуем метод класса Java:

#(.method fixed-object %) 

или

#(.method % fixed argument) 

или если ни один объект или аргументы фиксированы.

#(.method %1 %2) 

Часто используется с более строгими картами линий, фильтром и уменьшением.

(map #(.getMoney %) customers) 

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

  • Нет связанных вопросов^_^