我一直希望得到一个"运营商"在第183行,字符4-7 (参考此处的代码:http://pastebin.com/VxCM5cAV)
这些是我最近添加的行:
let rec sem ((e: exp), (r: eval env)) =
[...]
| Apply(Pipe tup, eArg) -> unrollPipe tup sem(eArg, r) r
[...]
and rec unrollPipe tup evarg r = match tup with
| Seq(Den f, ttup) ->
let fclosure= sem(Den f, r) in
match fclosure with
| Funval(arg, fbody, fDecEnv) ->
let fres = sem(fbody, bind(fDecEnv, arg, evarg)) in
unrollPipe Pipe(ttup) fres r
| RecFunVal(f, arg, fbody, fDecEnv) ->
let rEnv= bind(fDecEnv, f, fclosure) in
let aEnv= bind(rEnv, arg, evarg) in
let fres = sem(fbody, aEnv) in
unrollPipe Pipe(ttup) fres r
| Seq(Pipe(ftup), ttup) ->
let fres = unrollPipe Pipe(ftup) evarg r in
unrollPipe Pipe(ttup) fres r
| Nil -> evarg
| _ -> failwith("bad Pipe")
;;
sem应该是((exp * eval env) - > eval)函数
此代码的目的是实现一个解释器,它允许您将由一系列函数组成的管道(Funval,RecFunVal都作为" Ide f"或另一个管道给出)应用于给定的表达式表示参数(我只考虑一元函数)
要做到这一点,我每次出现一次Apply(Pipe(tup),eArg)并将参数计算到eval中,然后使用UnrollPipe(这是一个有趣的:元组* eval - > eval)来进行申请管道中的第一个函数,我之前评估过的参数,然后使用管道的尾部和前一个函数的结果作为参数递归调用自身,这导致计算管道中每个函数的组成。
我在此代码中使用的类型如下:
EXP:
type ide = string
type exp =
| Eint of int
| Ebool of bool
| Den of ide
| Sum of exp * exp
| Diff of exp * exp
| Prod of exp * exp
| Eq of exp * exp
| Minus of exp
| Iszero of exp
| Or of exp * exp
| And of exp * exp
| Not of exp
| Ifthenelse of exp * exp * exp
| Let of ide * exp * exp(* Dichiarazione di ide: modifica ambiente*)
| Fun of ide * exp(* Astrazione di funzione*)
| Apply of exp * exp (* Applicazione di funzione*)
| Letrec of ide(*nome fun*)*ide(*par.formale*)*exp(*body fun*)*exp(*body let*)
| Etup of tuple (*Tupla come espressione*)
| Pipe of tuple (*Concatenazione di funzioni*)
| ManyTimes of int * exp (*Esecuzione iterata di una funzione*)
and tuple =
| Nil (*Tupla vuota*)
| Seq of exp * tuple (*Tupla di espressioni*)
;;
和eval:
type eval=
| Int of int
| Bool of bool
| Unbound
| RecFunVal of ide * ide * exp * eval env
| Funval of efun
| ValTup of evtuple
and efun = ide* exp * eval env
and evtuple =
| Nil
| Seq of eval * evtuple
;;
编辑:我用大写字母命名函数,修复了它,现在它给了我一个新的"语法错误"在第183行,字符4-7 也更新了pastebin(http://pastebin.com/VxCM5cAV)
答案 0 :(得分:1)
我不愿意关注链接,所以我不知道第183行是什么。
您获得的语法错误可能是由于rec
中的and rec
造成的。根据该文档,rec
应仅在let rec
中(然后隐含在and
部分中)。 (rec
确实在字符4-7处,如果该行是一个。)
我注意到的另一件事是你将unrollPipe
定义为有三个参数但是将它与四个一起使用(即tup
,sem
,(eArg,r)
和{{1} })。如果r
的返回类型是函数类型,则该方法有效;但我宁愿怀疑你错过了一些括号。
答案 1 :(得分:0)
我看到的最明显的错误是UnrollPipe
以大写字母开头。函数名称必须以小写字母开头。尝试将其重命名为unrollPipe
(比如说)。