2012-07-09 5 views
5

매크로를 사용하면서 특정 조건을 유지하는 AST의 노드를 업데이트해야하는 요점 (필자는이를 피하려고 노력했습니다)에 도달했습니다. 값으로변경할 수있는 AST를 업데이트하는 가장 쉬운 방법은 무엇입니까?

Literal(Constant(1)) 

: 예를 들어, 나는 각 노드를 업데이 트하려는 가정 해 봅시다

Literal(Constant(2)) 

그 AST 노드가 식 트리 어디에서나있을 수있는, 그래서 임시을 사용할 수 없습니다 패턴 매칭 기. 분명히, 내가하고 싶은 마지막 일은 모든 컴파일러 프리미티브를 커버 할 수있는 전체 패턴 매처를 코딩하는 것입니다. 나는 API에서 검색하고 있지만, 과 같은 메소드는을 수집하고 패밀리는 트리를 선형 일로 처리하므로 내 요구 사항을 충족시키기에 충분하지 않으며 전체 업데이트를 원한다는 인상을 가지고 있습니다. 결과적으로 나무. 그래서, 똑똑한 방법으로 불변 식 트리를 업데이트 할 수 있습니까? 표준 API에서 '업데이트'작업이 존재하지 않는 이유는 무엇입니까?

+0

가 TreeTransformer있다. 아마 비슷한 매크로가 있어야한다고 생각합니다. – pedrofurla

+0

아마도 [zippers] (http://anti-xml.org/zippers.html) –

+0

@ NikitaVolkov를 확인하고 싶을 것입니다. 매크로의 문맥에서 묻지 않는다면 말입니다. – pedrofurla

답변

3
+0

Transformer의 소스 코드를 실제로 찾아야합니다. XML 변환 라이브러리처럼 보이며 해당 라이브러리는 트리의 깊이에 지수 적 성능을 발휘합니다. –

+0

문제와 관련한 야생 샷 : 하향식과 상향식 순회가 관련이 있습니까? 하향식 탐색에서 잎을 변경하면 위의 트리를 다시 빌드해야합니다. 위의 링크에서'traceImpl'을 구현하면 새로운 트리가 상향식으로 구성되었음을 알 수 있습니다 (적어도 거기에 있음). 그러나, 일반적으로'super.transform'을 호출하는 방법에 달려 있습니다. – Blaisorblade

2

데이터 구조에서 폴리 유형 노드를 일반적으로 수정하는 것은 데이터 유형 제네릭 (유형 생성자를 통한 코드의 매개 변수화)의 전형적인 경우입니다.

데이터 유형 일반 탐색 기능을 정의하는 "Scrap Your Boilerplate" 접근 방식과 같은 몇 가지 접근 방법이 있습니다.

하스켈에서

, 노드 업데이트 기능은 2 차원 매개 변수화 : 데이터 타입에 의해 코드 - 어디서든 구조에서, 서로 다른 종류의 서로 다른 업데이트 기능을 적용 할 수 있도록 :

-- | Apply a transformation everywhere in bottom-up manner 
everywhere :: (forall a. Data a => a -> a) 
      -> (forall a. Data a => a -> a) 

그래서에서 수행 Haskell은 타입 클래스에 크게 의존합니다. 스칼라 여기서 스칼라 매크로에서 AST 변압기를 사용하는 예이다 ported examples