2014-11-22 61 views
0

让我们有一个枚举的lambda项:堆积参考/反引用符号

#[deriving(Show, Clone, Eq, PartialEq)] 
enum Term { 
    Var(uint), 
    App(Box<Term>, Box<Term>), 
    Lam(uint, Box<Term>) 
} 

我写了简单的递归函数我能想到的:

fn size(t: &Term) -> uint { 
    match *t { 
     Var(_) => 1, 
     App(ref f, ref x) => 1 + size(&**f) + size(&**x), 
     Lam(_, ref t) => 1 + size(&**t) 
    } 
} 

&** -s不可避免的吗?在这种简单的情况下,我发现三个运营商有点多。另外,如果我想突变递归调用变成&mut**x,这更是一口。

回答

2

box运营商可用于解构框。因此,这将工作(在ref有助于避免一招,方便使它成为一个&Term

fn size(t: &Term) -> uint { 
    match *t { 
     Var(_) => 1, 
     App(box ref f, box ref x) => 1 + size(f) + size(x), 
     Lam(_, box ref t) => 1 + size(t) 
    } 
} 

#[deriving(Show, Clone, Eq, PartialEq)] 
enum Term { 
    Var(uint), 
    App(Box<Term>, Box<Term>), 
    Lam(uint, Box<Term>) 
} 

playpen

1.有计划,使其在deferenceable类型更通用