问题描述
let rec eval_expr env e = match e with
| Value(value) -> value
| ID(var) -> lookup(env,var)
| Fun(var,expr) -> Closure(env,var,expr)
| Not(expr) -> let val = eval_expr env expr in begin match val with
| Bool(a) -> Bool(not a)
| _ -> raise (TypeError ("Expected type bool")) end
| Binop(op,expr,expr2) -> begin match op with ...
然而,编译器抛出以下错误:
| Not(expr) -> let val = eval_expr env expr in begin match val with
^^^
Error: Syntax error
根据过去在匹配语句中出现 OCaml 错误的经验,如果您 100% 确信给定的行没有错误,则问题很可能出现在更早的行中。但是,我将这一行移到了开头,以便代码看起来像
let rec eval_expr env e = match e with
| Not(expr) -> let val = eval_expr env expr in begin match val with
| Bool(a) -> Bool(not a)
| _ -> raise (TypeError ("Expected type bool")) end
| Value(value) -> value
| ID(var) -> lookup(env,expr)
| Binop(op,expr2) -> begin match op with ...
仍然有同样的错误。所以错误就在这条线上,它可能是什么?如果有帮助,以下是类型:
type expr =
| Value of value
| ID of var
| Fun of var * expr
| Not of expr
| Binop of op * expr * expr
| If of expr * expr * expr
| FunctionCall of expr * expr
| Let of var * bool * expr * expr
type value =
| Int of int
| Bool of bool
| String of string
| Closure of environment * var * expr
解决方法
token val
是 OCaml 中的关键字。您只需要更改为不同的名称。我经常使用 valu
。