情報は力ではない

VimとかC++とかCUDAとか。

TaPL 演習4.2.2

問題

arithの実装におけるeval関数の定義を、大ステップスタイルに変えよ。

答案

もう少しうまく書きたい。

let rec eval1' t = 
  try
    match t with
      TmIf(_, t1, t2, t3) -> (
        let t1' = eval1'(t1) in
        match t1' with
          TmTrue(_)  -> let v2 = eval1'(t2) in v2
        | TmFalse(_) -> let v3 = eval1'(t3) in v3
        | _ -> raise NoRuleApplies)
    | TmSucc(fi, t1) when isnumericval t1 ->
        TmSucc(fi, eval1'(t1))
    | TmPred(_, t1) -> (
        let t1' = eval1'(t1) in
        match t1' with
          TmZero(_) -> t1'
        | TmSucc(_, nv1) when isnumericval nv1 -> nv1
        | _ -> raise NoRuleApplies)
    | TmIsZero(_, t1) -> (
        let t1' = eval1'(t1) in
        match t1' with
          TmZero(_) -> TmTrue(dummyinfo)
        | TmSucc(_, nv1) when isnumericval nv1 -> TmFalse(dummyinfo)
        | _ -> raise NoRuleApplies)
    | _ -> raise NoRuleApplies
  with NoRuleApplies -> t

感想

軽く試した感じは、ちゃんと動いてる。ただ正確に動くかどうかはCoq等で証明すべきなんだろうな。 あとは関数名をeval'とかにすべきだったかも。