在Ocaml中实现解释器

在Ocaml中实现解释器,ocaml,interpreter,caml,Ocaml,Interpreter,Caml,我正在尝试用Ocaml编写一个解释器,我已经为大多数操作定义了语法和语义。 我正在尝试执行另外两个操作: Ntimes:这有两个参数,一个整数和一个函数。Ntimes必须应用该功能n次 管道:这与linux bash中的管道相同 NTIME示例: Ntimes(Int(4),f);; 管道示例: Pipe(f1,(f2,(f3,(f4,(f5,Nil)))));; 我的对讲机是这样的: 语法 type ide = string;; type operator = Plus | Mi

我正在尝试用Ocaml编写一个解释器,我已经为大多数操作定义了语法和语义。 我正在尝试执行另外两个操作:

Ntimes:这有两个参数,一个整数和一个函数。Ntimes必须应用该功能n次

管道:这与linux bash中的管道相同

NTIME示例:

Ntimes(Int(4),f);;
管道示例:

Pipe(f1,(f2,(f3,(f4,(f5,Nil)))));;
我的对讲机是这样的:

语法

type ide = string;;

    type operator = Plus | Minus | Mul | Div | And | Or | Eq;;

    type exp = Int of int
             | Bool of bool
             | Den of string
             | Op of exp * operator * exp
             | Let of ide * exp * exp
             | Fun of ide * exp
             | Apply of exp * exp
             | Ifz of exp * exp * exp
             | Etup of tuple
             | Pipe of tuple
             | ManyTimes of int * exp
                and tuple = Nil | Seq of exp * tuple;;



type dexp = Dint of int | Dbool of bool | Dstring of string | Unbound | Dtuple of dexp list | Funval of efun and efun = ide * exp * dexp env ;;
运行时支持

let rec eval ((e: exp), (r:dexp env)) = match e with
         Int i -> Dint i
       | Bool i -> Dbool i
       .
       .
       .
       .
       | Etup e1 -> let v = (evalList e1 r) in Dtuple v
       | Apply(e1, e2) -> (match eval(e1, r) with
                | Funval(i, a, r1) -> eval(a, bind(r1, i, eval(e2, r)))
                | _ -> failwith("no funct in apply"))
       | NTimes(i,e) -> *I have no idea*
       | Pipe(e) -> * I have no idea*
       ;;

谢谢你们给我的任何帮助

为什么不使用一个简单的
列表
而不是那些“
tuple
s”?尝试将
时刻
/
管道
重写为
应用
s,然后调用
eval
。我没有使用
列表
,因为我必须用
tuple
实现它。元组是:元组是可以是不同类型的元素序列<代码>让p2=p2中的eval(让(“t”,Etup(序号(Int 3,序号(Int 33,序号(Bool true,Nil))),Den“t”),emptyenv Unbound)@BergiYeah,你仍然应该意识到它们形成了一个列表结构,你可以(应该)对其使用结构递归。或者你把它转换成一个
exp列表
,如果这能简化它的话。@PatJ实际上作业是编写整个解释器,我只是错过了这两个操作。我不是要代码,但我只是在寻找一些想法。