2010-06-10 3 views
12

키워드의 임시 계층 구조를 만드는 Clojure의 시스템은 언어 사용에 많은 시간을 소비 한 대부분의 사람들에게 친숙합니다. 예를 들어, 대부분의 데모와 언어의 프리젠 테이션은클로저에 독립 계층을 사용해야하는시기와 방법은 무엇입니까?

(derive ::child ::parent) 

등의 사례를 포함하고이이 멀티 방법 파견에 사용할 수있는 방법을 보여로 이동.

내가 본 모든 슬라이드와 프레젠테이션에서 전역 계층 구조를 사용합니다. 그러나 h가 (make-hierarchy)에 의해 생성되는 (h :: child :: parent 파생)을 사용하여 독립적 인 계층 구조에 키워드 관계를 넣는 것이 가능합니다. 따라서 다음과 같은 몇 가지 질문이 있습니다.

  • 이것이 유용하거나 필요한시기에 대한 지침이 있습니까?
  • 계층 구조를 조작하는 데 필요한 함수가 있습니까?

병합 특히 유용합니다, 그래서 나는이 작업을 수행 :

(defn merge-h [& hierarchies] 
    (apply merge-with (cons #(merge-with clojure.set/union %1 %2) hierarchies)) 

그러나 그러한 기능이 이미 어딘가에 존재하는 경우 궁금 해서요.

EDIT :이 용어가이 동물을 더 잘 설명하기 때문에 "맞춤"계층 구조가 "독립적 인"계층 구조로 변경되었습니다. 또한, 나는 약간의 조사를했고, 나 자신의 대답을 아래에 포함시켰다. 더 많은 의견을 환영합니다.

답변

5

나는 지난 몇 일 동안이 문제에 파 놓은 광산는데, 내가 어떤 답이 있다고 생각 : 독립적 인 계층 구조에 사용

  1. 기능을 동일한 기능 글로벌 계층 구조를 사용하는 경우 다른 의미를 가지고 . Doing (kwd1 kwd2 파생)은 부작용 (전역 계층의 항목)을 생성합니다. 반면에, (kwd1 kwd2 계층 구조를 파생시킵니다) 기능적입니다 - 함수는 var를 수정하는 대신 새로운 계층 구조를 반환합니다.
  2. 독립적 인 계층 구조를 사용하면 동일한 키워드에 대해 여러 가지 다른 계층 구조를 가질 수 있습니다. 그래서 예를 들면 :

    (DEF 농구 - 계층 구조 (유도 (메이크업 계층 구조) : 그레츠키 : 요르단))

    (DEF 하키 - 계층 구조 (파생() - 계층 구조를 만들 : 요르단 : 그레츠키를))

는 것을 나타낼 수 : 반대는 하키 계층 구조에서 진정한 반면, 그레츠키 : 조던보다 농구 계층 구조에서 더 높다.

또한 비 이름 공간 키워드는 전역 계층 구조가 아닌 독립적 인 계층 구조에 포함될 수 있습니다. 그래서

(derive (make-hierarchy) :a :b) 

는 작동하지만 글로벌 계층 구조, 키워드는 네임 스페이스에 있어야 할 것입니다 : nspace 일부 공간입니다

(derive :nspace/a :nspace/b) 

합니다. (이 네임 스페이스는 실제로 아무 데나, 흥미롭게도 선언 할 필요가 없습니다.)

요약하면, 하나 이상의 계층 구조가 필요할 때 또는 런타임 중에 계층 구조를 광범위하게 수정해야하는 경우 독립적 인 계층 구조를 사용해야합니다. 또한 누드 키워드에 대한 계층 구조를 원할 경우 독립적 인 계층 구조가 필요합니다.

+0

스포츠 예제에 대한 한 가지 우려 사항은 다음과 같습니다. (isa? hockey-hierarchy : jordan : gretzky) => true. 즉, 이들은 유형 계층 구조입니다. 그러나 요점은 유효합니다. 동일한 단어가 여러 도메인의 서로 다른 유형 관계에서 서로 다른 유형이 될 수 있으므로 로컬 계층 구조가 필요합니다. 사실, 나는 우리가 세계적인 계급을 망쳐 놓는 것이 허락된다는 것에 놀랐다. – kennytilton

관련 문제