2013-11-29 49 views
-1

我試圖在Concurrent 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

您的代碼在語法上格式不正確,並且在格式正確的位中有許多類型錯誤。下面是一些建議:

  1. fun loop...是一個定義,但是你在表達式中列出。定義必須位於頂層或在let區塊內(您可以更早移動它,但除非您在某處調用loop,否則它將不會執行任何操作。)
  2. 在定義結束時不需要分號,這甚至可能會形成不良。
  3. buffer= (recv inCh);與調用(recv inCh)的結果進行比較buffer(您已界定爲[]),然後丟棄結果。除了調用recv inCh的副作用,那就是
  4. val inCh:int inCh =channel()在語法上是格式不正確的。我假設你的意思是val inCn : int = channel(),但是那樣不能輸入,因爲channel()不返回int

請檢查http://www.eecs.ucf.edu/~leavens/learning-SML.html並通過SML教程的一個工作第一。