diff options
Diffstat (limited to 'src/scTypes.ml')
| -rw-r--r-- | src/scTypes.ml | 37 | 
1 files changed, 9 insertions, 28 deletions
diff --git a/src/scTypes.ml b/src/scTypes.ml index e85b2f1..f0a42d4 100644 --- a/src/scTypes.ml +++ b/src/scTypes.ml @@ -105,15 +105,6 @@ module Refs = struct      | Cell of Cell.t                                      (** A cell *)      | Range of Cell.t * Cell.t                            (** An area of cells *) -  let shift (vector_x, vector_y) ref = -    let _shift ((x, y), (fixed_x, fixed_y)) = -      let x' = if fixed_x then x else x + vector_x -      and y' = if fixed_y then y else y + vector_y in -        (x', y'), (fixed_x, fixed_y) -    in match ref with -    | Cell x -> Cell (_shift x) -    | Range (fst, snd) -> Range (_shift fst, _shift snd) -    let cell c = Cell c    let range c1 c2 = Range (c1, c2) @@ -152,44 +143,34 @@ module Expr = struct    let callN ident params = CallN(ident, params)    let expression e = Expression e -  let rec shift_exp vector = function -    | Value v -> Value v -    | Call0 ident -> Call0 ident -    | Call1 (ident, p1) -> Call1 (ident, shift_exp vector p1) -    | Call2 (ident, p1, p2) -> Call2 (ident, shift_exp vector p1, shift_exp vector p2) -    | Call3 (ident, p1, p2, p3) -> Call3 (ident, shift_exp vector p1, shift_exp vector p2, shift_exp vector p3) -    | CallN (ident, params) -> CallN (ident, List.map (shift_exp vector) params) -    | Ref r -> Ref (Refs.shift vector r) -    | Expression expr -> Expression (shift_exp vector expr) -    module Eval(E:Sym_expr.SYM_EXPR) = struct      module T = Type.Eval(E.T)      module R = Refs.Eval(E.R) -    let eval e t = begin +    let eval e = begin        let rec _eval v k = begin match v with -      | Ref r -> k @@ E.ref (R.eval_ref r) t -      | Value v -> k @@ E.value (T.eval_type v) t -      | Call0 ident -> k @@ E.call0 ident t +      | Ref r -> k @@ E.ref (R.eval_ref r) +      | Value v -> k @@ E.value (T.eval_type v) +      | Call0 ident -> k @@ E.call0 ident        | Call1 (ident, p1) ->          _eval p1 (fun v1 -> -          k @@ E.call1 ident v1 t) +          k @@ E.call1 ident v1)        | Call2 (ident, p1, p2) ->          _eval p1 (fun v1 ->            _eval p2 (fun v2 -> -            k @@ E.call2 ident v1 v2 t)) +            k @@ E.call2 ident v1 v2))        | Call3 (ident, p1, p2, p3) ->          (_eval[@tailcall]) p1 (fun v1 ->           (_eval[@tailcall]) p2 (fun v2 ->             (_eval[@tailcall]) p3 (fun v3 -> -            k @@ E.call3 ident v1 v2 v3 t))) +            k @@ E.call3 ident v1 v2 v3)))        | CallN (ident, exprs) ->          let mapped = List.map (fun x -> _eval x (fun x -> x)) exprs in -        k @@ E.callN ident mapped t +        k @@ E.callN ident mapped        | Expression e -> -        (_eval[@tailcall]) e (fun v1 -> k @@ E.expression v1 t) +        (_eval[@tailcall]) e (fun v1 -> k @@ E.expression v1)        end in        E.observe (_eval e (fun x -> x))  | 
