2014-04-16 4 views
2

Clojure에서 Java 메서드를 함수 인수로 사용하려면 어떻게해야합니까? 작동하지 않는Clojure에서 함수 인수로 java 메서드 사용

user> (Integer. (str \9)) 
9 
user> ((comp Integer. str) \9) 
CompilerException java.lang.ClassNotFoundException: Integer., compiling:(NO_SOURCE_PATH:1:2) 

:

예를 들어, 나는 기능 구성을 만들고 싶어.

memfn도 도움이되지 않습니다

user> (map (comp (memfn Integer.) str) "891") 
IllegalArgumentException No matching method found: Integer. for class java.lang.String clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53) 

어떤 아이디어?

관련 질문 (즉,하지만, 질문에 대한 정답을 제공하지 않음) :

  • Why does Clojure say "no matching method" for an illegal argument?
  • How do I use Clojure memfn with a Java constructor?
  • How to get an Fn which calls a Java method?

    (참고 : 익명의 함수를 래퍼로 사용하여 dave가 제안한 대답이 가장 좋은 해결책 인 것 같습니다.)

  • 답변

    3

    Java 메소드는 Clojure 함수와 달리 최상위 클래스로 설계되지 않았습니다. Clojure에서 Java inter-op를 사용하면 문자 그대로 Java 메소드로 작업하므로 Clojure 함수에 구현 된 추가 이점을 얻지 못합니다. 자세한 내용은 아래의 설명을 참조하십시오. 인수로 Java 메소드를 사용하는 해결 방법으로

    , 당신은 효과적으로 Clojure의 기능을하고, 다음과 같이 익명 함수에서 그 (것)들을 포장 할 수 있습니다

    ((comp #(Integer. %) str) \9) 
    
    +0

    데이브, 즉 아무것도보다 낫다, 감사합니다,하지만 다른 방법도 있기를 바랍니다 (+1) –

    +2

    Clojure가 작동하지 않는 이유는 무엇입니까? Clojure 함수는'IFn' 인터페이스를 따르는 Java * 객체 *입니다.이 인터페이스는 최대 20 개의 모든 속성을 호출하는 메서드와 무한히 긴 인수 목록을 호출하는 두 가지 방법이 있습니다. 이 모든 것들은 Java' Object' 인수를 취하고 또한 Java' Object'를 반환합니다. 'IFn'은 https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/IFn.java – Thumbnail

    +1

    에서 찾을 수 있습니다. 내가 보는 바와 같이 선택 사항은 진정한 일등 가치 (언어를 약하게 만든다)가 아닌 함수를 사용하거나 모든 jvm 메소드를 추상화하여 진정한 기능처럼 행동하게함으로써 (언어를 지나치게 복잡하게 만든다.) – noisesmith

    관련 문제