2010-12-31 2 views
1

clojure STM을 사용하여 내 애플리케이션의 데이터를 저장하고 데이터 구조가 데이터 스토어에 보이지 않게 유지되도록하고 싶습니다. API의 사용자가 인식하지 못하도록 내 고유 한 기능으로 내장 된 유형을 확장하는 방법은 무엇입니까?STM 트랜잭션에서 클로저 해시 맵 오버로드

데이터 구조를 조작하기 위해 표준 clojure 호출을 모두 사용하여 API 호출자가 인식하지 못하도록하고 싶습니다. 이게 가능한가?

+0

이것이 중복인지 확실하지 않습니다. http://stackoverflow.com/questions/4522796/how-should-i-make-a-clojure-stm-program-persistent –

+0

몇 가지면에서 그렇습니다. 이 질문에서 나는 clojure 핵심 함수 오버로드에 대해 더 자세히 알아 내려고 노력했다. – Zubair

답변

1

deftype은 새로운 데이터 구조 유형의 객체를 만들기 위해 설계되었지만 Clojure-in-Clojure 및 Clojure 내부의 프로토콜 크기가 늘어날 때까지 이러한 목표를 달성 할 수 있는지 확신하지 못합니다. 나는 잘못 생각하고 싶어. :)

2

이 방법이 맞는지 확실하지 않지만 인터페이스 (프로토콜)를 clojure.lang에서 확장 할 수 있습니다. 다음은지도의 assoc 기능에 부작용을 추가하는 매우 간단한 예입니다 (필요한 경우).

(deftype LolMap [m] 
    clojure.lang.IPersistentMap 
    (assoc [this k v] (do (println (str k " CAN HAS " v "!")) 
         (LolMap. (assoc m k v)))) 
    clojure.lang.Seqable 
    (seq [this] (seq m))) 

유형은 단지 실제지도를 감싸고, 당신은 관련된 모든 인터페이스에 대한 적절한 구현을 제공해야 할 것이다 (IPersistentMap 및 Seqable는 최소한의 인스턴스화와 REPL의 인스턴스를 인쇄 할 수 있습니다). 모든 읽기 연산에서 실제 맵 기능을 구현으로 전달하기 만하면됩니다.

+0

코드에서이 수정 된 버전을 사용하기 위해 내 clojure.core 가져 오기를 어떻게 오버라이드하겠습니까? – Zubair

+0

그렇지 않습니다. 이것은 다형성이 데이터 형식과 프로토콜을 사용하는 클로저에서 작동하는 방식입니다. 'assoc' 함수는 모든 "일반"맵에 대해 동일하게 유지됩니다. 사용자 정의 유형에 적용될 때만 (구현의 첫 번째 인수 유형을 디스패치) 구현체를 사용합니다. – casphas

+0

아직 이해가 안되지만, Clojure 유형에 대한 연구를 한 다음 다시 돌아올 것입니다. 입력 해 주셔서 감사합니다. – Zubair

관련 문제