2014-11-22 3 views
0

가의 람다 용어를 열거 보자 :스택 참조/역 참조 기호

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 위치 :

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

은 내가 생각할 수있는 가장 간단한 재귀 함수를 썼다? 나는 이처럼 단순한 경우에 세 명의 연산자가 조금은 있음을 알았다. 또한 돌연변이를 원한다면 재귀 호출은 &mut**x이되며, 이는 더 많은 입을가집니다.

답변

2

box 연산자는 박스 을 제거하는 데 사용할 수 있습니다. 그래서이합니다 (ref는 이동을 방지하는 데 도움이 편리하게 &Term로하게 작동합니다 deferenceable 종류 이상이 더 일반적인 만들 계획이 있습니다

1)

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

관련 문제