Removed multiple input functions, added tuples, fixed parser
This commit is contained in:
@ -14,14 +14,19 @@ let rec evaluate (mem: memory) (command: t_exp) : (permittedValues, error) resul
|
||||
None -> Error (`AbsentAssignment ("The variable " ^ v ^ " is not defined."))
|
||||
| Some a -> Ok a
|
||||
)
|
||||
| Function (xs, _, f) ->
|
||||
| Tuple (x, y) -> (
|
||||
let* xval = evaluate mem x in
|
||||
let* yval = evaluate mem y in
|
||||
Ok (TuplePermitted (xval, yval))
|
||||
)
|
||||
| Function (x, _, f) ->
|
||||
Ok (FunctionPermitted
|
||||
{inputList = xs;
|
||||
{input = x;
|
||||
body = f;
|
||||
assignments = mem.assignments;
|
||||
recursiveness = None}
|
||||
)
|
||||
| Application (f, xs) -> (
|
||||
| Application (f, x) -> (
|
||||
let* evalf = evaluate mem f in
|
||||
let* funcClosure = (
|
||||
match evalf with
|
||||
@ -30,45 +35,20 @@ let rec evaluate (mem: memory) (command: t_exp) : (permittedValues, error) resul
|
||||
^ " it's an integer"))
|
||||
| BooleanPermitted _ -> Error (`WrongType ("Function is not a function,"
|
||||
^ " it's a boolean"))
|
||||
| TuplePermitted _ -> Error (`WrongType ("Function is not a function,"
|
||||
^ " it's a tuple"))
|
||||
) in
|
||||
let parmList = List.map (fun k -> evaluate mem k) xs in
|
||||
let rec helper m params values =
|
||||
match (params, values) with
|
||||
(_, []) -> Ok (m, params)
|
||||
| ([], _) ->
|
||||
Error (`WrongArity ("Function application has arity " ^
|
||||
(List.length funcClosure.inputList
|
||||
|> string_of_int) ^
|
||||
", but was applied to " ^
|
||||
(List.length xs |> string_of_int) ^
|
||||
" parameters"))
|
||||
| (p::tlparams, (Ok v)::tlvalues) -> helper
|
||||
(VariableMap.add p v m)
|
||||
tlparams
|
||||
tlvalues
|
||||
| (_, (Error e)::_) -> Error e
|
||||
in
|
||||
let* (mem2assignments, params) = helper
|
||||
funcClosure.assignments
|
||||
funcClosure.inputList
|
||||
parmList
|
||||
in
|
||||
let mem2 = (
|
||||
let* param = evaluate mem x in
|
||||
let mem2 =
|
||||
match funcClosure.recursiveness with
|
||||
None -> {assignments = mem2assignments}
|
||||
| Some nameF -> {
|
||||
assignments =
|
||||
VariableMap.add
|
||||
nameF
|
||||
(FunctionPermitted funcClosure)
|
||||
mem2assignments
|
||||
}
|
||||
) in
|
||||
match params with
|
||||
[] -> evaluate mem2 funcClosure.body
|
||||
| _ -> (
|
||||
Ok (FunctionPermitted {funcClosure with inputList = params;
|
||||
assignments = mem2assignments}))
|
||||
None -> {assignments = (
|
||||
VariableMap.add funcClosure.input param funcClosure.assignments)}
|
||||
| Some nameF -> {assignments = (
|
||||
VariableMap.add funcClosure.input param funcClosure.assignments |>
|
||||
VariableMap.add nameF (FunctionPermitted funcClosure)
|
||||
)}
|
||||
in
|
||||
evaluate mem2 funcClosure.body
|
||||
)
|
||||
| Plus (a, b) ->
|
||||
let* aval = (
|
||||
@ -248,7 +228,24 @@ let rec evaluate (mem: memory) (command: t_exp) : (permittedValues, error) resul
|
||||
)
|
||||
in
|
||||
Ok (BooleanPermitted (not aval))
|
||||
|
||||
| First a ->
|
||||
let* aval = (
|
||||
match evaluate mem a with
|
||||
Ok TuplePermitted (x, _) -> Ok x
|
||||
| Error e -> Error e
|
||||
| _ -> Error (`WrongType ("Value is not a tuple"))
|
||||
)
|
||||
in
|
||||
Ok (aval)
|
||||
| Second a ->
|
||||
let* aval = (
|
||||
match evaluate mem a with
|
||||
Ok TuplePermitted (_, x) -> Ok x
|
||||
| Error e -> Error e
|
||||
| _ -> Error (`WrongType ("Value is not a tuple"))
|
||||
)
|
||||
in
|
||||
Ok (aval)
|
||||
| Cmp (exp_1, exp_2) ->
|
||||
let* exp_1val = match evaluate mem exp_1 with
|
||||
Ok IntegerPermitted x -> Ok x
|
||||
@ -329,13 +326,13 @@ let rec evaluate (mem: memory) (command: t_exp) : (permittedValues, error) resul
|
||||
let* evalxval = evaluate mem xval in
|
||||
let mem2 = {assignments = VariableMap.add x evalxval mem.assignments} in
|
||||
evaluate mem2 rest
|
||||
| LetFun (f, xs, _, fbody, rest) ->
|
||||
| LetFun (f, x, _, fbody, rest) ->
|
||||
let mem2 = {
|
||||
assignments =
|
||||
VariableMap.add
|
||||
f
|
||||
(FunctionPermitted
|
||||
{ inputList = xs;
|
||||
{ input = x;
|
||||
body = fbody;
|
||||
assignments = mem.assignments;
|
||||
recursiveness = Some f})
|
||||
@ -345,7 +342,7 @@ let rec evaluate (mem: memory) (command: t_exp) : (permittedValues, error) resul
|
||||
|
||||
|
||||
let reduce (program: t_exp) (iin : int) : (int, error) result =
|
||||
let program' = (Application (program, [(Integer iin)])) in
|
||||
let program' = (Application (program, (Integer iin))) in
|
||||
let mem : memory = {assignments = VariableMap.empty} in
|
||||
match (evaluate mem program') with
|
||||
Ok IntegerPermitted a -> Ok a
|
||||
|
||||
Reference in New Issue
Block a user