2017-05-05 3 views
1

나는 clojure를 사용해야하는 방법을 이해하는 데 어려움이있는 것 같습니다 map. 나는 in-grids이라는 객체리스트를 가지고 있는데, 여기서 나는 getCoordinateSystem 메쏘드를 사용하지 않을 것이다. 목록에있는 객체가 Java 클래스인지 확인하는 것이 중요하다고 생각합니다. 내가 직접 클로저에 함수를 정의하면 map이 작동합니다.clojure는지도를 통해 목록을 통해 기능을 적용 할 수 없습니다.

(.getCoordinateSystem (first in-grids))

하지만이

(map .getCoordinateSystem in-grids)

을 그리고 오류는 다음과 같습니다 :

이 작동 java.lang.RuntimeException: Unable to resolve symbol: .getCoordinateSystem in this context

내가 아마 여기 정말 뭔가를 분명 실종 해요,하지만 정확하게?

답변

5

당신은

(map f sequence) 

다음 f 다음 sequence의 모든 요소에 대한 호출 IFn의 인스턴스를 참조해야 형태의 표현이있는 경우.

.은 특별한 형태이며 .getCoordinateSystemIFn 인스턴스를 나타내지 않습니다.

(.getCoordinateSystem (first in-grids)) 

는 직접 예를 들어, 함수 값을 생성 할 수

(. (first in-grids) (getCoordinateSystem)) 

동등

(map #(.getCoordinateSystem %) in-grids) 
+0

완벽하게, 전에 '# (%)'구문을 사용했지만 여기를 잊어 버렸습니다! – kakk11

2

map에 편리한 대안이 for 기능 종종 또 다른 선택이 방식으로 for를 사용

(for [grid in-grids] 
    (.getCoordinateSystem grid)) 

map 것과 같은 효과가 있지만, 좀 더 명시 적은 "하나입니다 -item-at-at-time "처리의 성격을 나타냅니다. 또한 Java 함수 getCoordinateSystem을 직접 호출하기 때문에 Clojure 함수 리터럴에 직접 랩핑 할 필요가 없습니다.

+0

감사합니다. 귀하의 솔루션을 알아두면 좋습니다. – kakk11

0

Lee의 대답 대신, 그 대답과 비슷한 코드로 확장되는 memfn 매크로가 있습니다.

(map (memfn getCoordinateSystem) in-grids) 

(macroexpand '(memfn getCoordinateSystem)) 
;=> (fn* ([target56622] (. target56622 (getCoordinateSystem)))) 
+0

'memfn'은 함수 리터럴'# (my-fn ...)'이전의 시간에서 오래된 기법이며, 현재 다소 오래된 것으로 간주됩니다. –