2010-06-17 6 views
5

: 정의의 Clojure multimethods

(derive ::rect ::shape) 
(derive ::square ::rect) 

지금하여 shapes 네임 스페이스에 다음 실행 :

(isa? ::square ::shape) 

반환 true. 내가 실행할 때 그러나

(isa? ::square ::shape) 

그것은 false를 반환, 실제로 도면에 대한 multimethods을 구현하는 네임 스페이스에 다음과 같습니다. 그래서 비록 내가 올바른 multimethod 디스패치 함수를 가지고있다하더라도 "디스패치 함수를 찾지 못했습니다"라는 오류가 발생합니다.

내가 누락 된 항목이 있습니까? 하나의 거대한 네임 스페이스에 모든 유형의 모양을 구현하는 것은 나에게 무의미한 것처럼 보입니다.

답변

3

다른 이름 공간의 유형을 사용하려면 다음과 같은 정규화 된 이름을 사용해야하는 현재 이름 공간을 사용합니다.

0

자판에서 :: 연산자가 현재 네임 스페이스에서 무엇인가를 찾습니다.

재미있는 점 중 하나는 재미있는 점은 키워드는 원하는 모든 네임 스페이스에서 네임 스페이스가 될 수 있다는 것입니다. 어떤 네임 스페이스에도 키워드가 선언 될 수 있습니다. 따라서 네임 스페이스 트리가 복잡하고 선호하는 것 : 기하학/사각형, : 기하학/원 등을 사용할 수 있습니다.

또한, isa를 파생하고, 시행하며 (지금 당장 사용하지 마십시오), isa를 잊지 마십시오. 및 관련 함수를 사용하면 원하는 경우 독립적 인 계층 구조를 사용할 수 있습니다. When and how should independent hierarchies be used in clojure?

0

::도 네임 스페이스 별칭과 함께 사용할 수 있습니다.

(ns some.other.package 
    (:require [some.terr.ibly.long.package.name :as short])) 

지금 : 짧은/abc` : ::short/abc이가 있어야하지 :some.terr.ibly.long.package.name/abc

+0

'와 동일하게 참조 할 것인가? – amalloy

+0

아니요.하지만 12자를 더 입력해야합니다. – kotarak