在Concurrent ML中创建类似抽象的“邮箱”

时间:2013-11-29 07:07:40

标签: smlnj ml

我正在尝试在Concurrent ML中创建一个有限的“邮箱”,就像抽象一样。我的抽象有两个用于获取值的通道(稍后存储在名为“缓冲区”的列表中)以及用于发送值。

CM.make "$cml/cml.cm";
open CML;
fun mailbox inCh outCh buffer = let val inCh:int inCh =channel()
                                    val outCh:int outCh=channel()
                                    val buffer= [];
                                in 
                                buffer= (recv inCh);
                                fun loop x = choose[wrap (recvEvt inCh, loop ), wrap (sendEvt (outCh, (hd buffer)), buffer=tl(), loop x)];
                                end
fun main()=let 
            val iC:int iC=channel()
            val oC:int iC=channel()
            val buf=[];
            in
            spawn(fn()=> mailbox iC oC buf);
            RunCML.doit(main,NONE);
            ()
            end

这段代码在语法上似乎是正确的,但是会给出一个编译错误说明

mailboxtemp.sml:7.28 Error: syntax error: inserting  LET
mailboxtemp.sml:9.9 Error: syntax error: inserting  IN ID END

uncaught exception Compile [Compile: "syntax error"]
  raised at: ../compiler/Parse/main/smlfile.sml:15.24-15.46
             ../compiler/TopLevel/interact/evalloop.sml:44.55
             ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20

有人可以帮我找出我可能犯错的地方吗?

感谢。

1 个答案:

答案 0 :(得分:1)

您的代码语法不正确,并且在格式良好的位中存在大量类型错误。以下是一些建议:

  1. 您的fun loop...是一个定义,但您将其列在表达式的中间。定义必须位于顶级或let块内(您可以提前移动它,但除非您在某处调用loop,否则它将无法执行任何操作。
  2. 在定义的末尾不需要分号。那甚至可能是不合格的。
  3. buffer= (recv inCh);行将buffer(您已定义为[])与调用(recv inCh)的结果进行比较,然后丢弃该结果。除了调用recv inCh的副作用外,这完全没有意义。
  4. val inCh:int inCh =channel()语法错误。我假设您的意思是val inCn : int = channel(),但是没有输入,因为channel()没有返回int
  5. 请检查http://www.eecs.ucf.edu/~leavens/learning-SML.html并首先完成其中一个SML教程。