我正在尝试在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
有人可以帮我找出我可能犯错的地方吗?
感谢。
答案 0 :(得分:1)
您的代码语法不正确,并且在格式良好的位中存在大量类型错误。以下是一些建议:
fun loop...
是一个定义,但您将其列在表达式的中间。定义必须位于顶级或let
块内(您可以提前移动它,但除非您在某处调用loop
,否则它将无法执行任何操作。buffer= (recv inCh);
行将buffer
(您已定义为[]
)与调用(recv inCh)
的结果进行比较,然后丢弃该结果。除了调用recv inCh
的副作用外,这完全没有意义。val inCh:int inCh =channel()
语法错误。我假设您的意思是val inCn : int = channel()
,但是没有输入,因为channel()
没有返回int
。请检查http://www.eecs.ucf.edu/~leavens/learning-SML.html并首先完成其中一个SML教程。