2012-07-09 28 views
5

Makrolarla çalışırken, belirli koşullara sahip AST'deki düğümleri güncellemem gereken noktaya (bunu önlemek için çok uğraştım) ulaştım. değeriyleDeğişken bir AST'yi güncellemenin en kolay yolu nedir?

Literal(Constant(1)) 

: Örneğin, en Her düğüm güncellemek istiyorum diyelim

Literal(Constant(2)) 

olanlar AST düğümleri ifade ağacında her yerde olabilir, bu yüzden bir reklam-hoc kullanamazsınız desen eşleştiricisi. Açıkçası, yapmak istediğim en son şey, tüm derleyici ilkellerini kapsayabilen tam bir desen eşleştiricisini kodlamak. API'da arama yaptım ama ve dönüşümlü ailesi gibi yöntemlerin gereksinimlerimi karşılayacak kadar iyi olmadığına dair izlenime sahibim, çünkü ağacı doğrusal bir şey olarak kabul ediyorlar ve tümünün güncellenmesini istiyorum sonuç olarak ağaç. Yani, değişmez bir ifade ağacını akıllı bir şekilde güncellemek mümkün mü? Standart API'da neden böyle bir 'güncelleme' işlemi yok? Veri yapıları poli yazılan düğümleri değiştirme

+0

bir TreeTransformer yoktur. Sanırım makrolar için benzer, belki de aynı olmalı. – pedrofurla

+0

Muhtemelen ben o makro bağlamında sormuyordum eğer söyleyebilirim, [fermuarlar] (http://anti-xml.org/zippers.html) –

+0

@NikitaVolkov kontrol etmek isteyeceklerdir. – pedrofurla

cevap

3
+0

Transformer'ın kaynak kodunu aramak zorundayım. XML dönüştürme kitaplığına benziyor ve bu kütüphanenin ağacın derinliği üzerinde üstel performansa sahip. –

+0

Konuyla ilgili vahşi bir çekim: bu yukarıdan aşağıya aşağıdan yukarıya geçişe mi ilişkindir? Yukarıdan aşağıya doğru bir geçişte, bir yaprağın değiştirilmesi, yukarıdaki ağacın yeniden inşasını ima eder. Yukarıdaki bağlantıda "traceImpl" uygulamasının uygulanması, yeni ağaçların aşağıdan yukarıya (en azından orada) oluşturulduğunu gösterir. Ancak, genel olarak, 'super.transform' dediğinize bağlı. – Blaisorblade

2

genel olarak veri türü jenerik (tip kurucu ile kod parametrizasyonu) klasik bir durumdur.

çeşitli yaklaşımlar veri türü genel geçişi fonksiyonlarını tanımlayan örneğin "Scrap Your Boilerplate" yaklaşımı gibi işlemler, ana kadar.

Haskell'de

, düğüm güncelleme fonksiyonu iki boyutta parametreleştirilmiştir: veri türü ve kodla - her yerde bir yapıda, farklı türlerine farklı güncelleme fonksiyonlarını uygulayabilir böylece:

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

yüzden de yapmak Haskell, büyük ölçüde tip sınıflarına dayanır. Scala yılında Burada Scala makro AST trafosu kullanılarak bir örnek ported examples

İlgili konular