我有一個樹狀結構的抽象類和表示小語言抽象語法樹的案例類。只有部分匹配的結構上的映射
對於頂級抽象類我實現的方法map
:
abstract class AST {
...
def map(f: (AST => AST)): AST = {
val b1 = this match {
case s: STRUCTURAL => s.smap(f) // structural node for example IF(expr,truebranch,falsebranch)
case _ => this // leaf, // leaf, like ASSIGN(x,2)
}
f(b1)
}
...
的smap的定義如下:
override def smap(f: AST => AST) = {
this.copy(trueb = trueb.map(f), falseb = falseb.map(f))
}
現在我寫不同的「轉變」插入,刪除和更改AST中的節點。
例如,從塊中刪除相鄰NOP節點:
def handle_list(l:List[AST]) = l match {
case (NOP::NOP::tl) => handle_list(tl)
case h::tl => h::handle_list(tl)
case Nil => Nil
}
ast.map {
case BLOCK(listofstatements) => handle_list(listofstatements)
}
如果我寫這樣的,我最終MatchError
和由上述地圖改變到I可以「修復」:
ast.map {
case BLOCK(listofstatements) => handle_list(listofstatements)
case a => a
}
我應該和所有那些人一起生活嗎?或者我可以用某種方式改進我的map
方法(或其他部分)嗎?
哇!我繼續在斯卡拉看到奇妙的事物。這正是我所尋找的 – svrist 2010-08-21 06:18:46
這段代碼可能有點不對,因爲我沒有注意到'f'被用作'smap'的參數。固定。 – 2010-08-21 07:22:08
是不是'orElse'而不是'和Then'? – svrist 2010-08-23 09:54:35