2011-01-12 3 views
8

Clojure 메타는 함수가 그렇게 처리하고 Clojure 핵심 함수가 메타를 전역 적으로 보존하지 않는 경우에만 보존됩니다. 필자가 들었던 일반적인 규칙은 conj, assoc 등과 같은 콜렉션 함수는 메타를 유지하지만 맵, 필터, 테이크 등과 같은 시퀀스 함수는 메타를 보존하지 않는다고 가정합니다.Clojure 코어의 어떤 기능이 메타를 보존합니까?

메타를 유지하는 기능이있는 목록이 있습니까?

답변

5

모든 유형이 있습니다. 시퀀스 함수는 인수에 seq을 호출하는 것처럼 동작하므로 항상 동일한 유형의 객체를 반환하지는 않습니다. 콜렉션 함수 및 유형 특정 함수는 seq를 호출하지 않고 주어진 유형과 동일한 유형의 오브젝트를 리턴합니다. 그것은 실제로 그런 경우가 아니라 할지라도 그들에게 같은 객체를 반환한다는 착각을하게합니다 (이 동작에 대한 추론 일 수 있음). 우리는 엄지 손가락의 규칙은 유형을 보존 할 때 함수가 메타를 보존한다는 것입니다.

user> (meta (seq (with-meta (list 1) {:a 1}))) 
{:a 1} 
user> (meta (seq (with-meta (vector 1) {:a 1}))) 
nil 

게으름이 힘든 관련된 경우에주의해야합니다 : 컬렉션 메타 보존 기능의 목록은

user> (type (list 1)) 
clojure.lang.PersistentList 
user> (type (map identity (list 1))) 
clojure.lang.LazySeq 
user> (meta (seq (with-meta (map identity (list 1)) {:a 1}))) 
nil 

에서, data structures 페이지를 참조하십시오. 메타를 보존하지 않는 페이지는 sequences 페이지 아래에 있습니다. 단, 같은 유형의 객체를 반환하는 경우는 예외입니다. 후드 아래에서

나는 게으름부터 세부 사항에 대해 아주 잘 모르겠어요 및 추가 된 순서를 청크,하지만 당신은 RT 클래스에서 cons, seqseqFrom 방법을 볼 수 있습니다. 메타 데이터를 보존하지 않는 함수는 이러한 메서드를 사용합니다. 컬렉션 함수는 해당 유형에 특정한 메소드를 사용하여 끝납니다.

관련 문제