2010-02-16 12 views
10

Aşağıdaki Erlang kodunu göz önünde bulundurun:Haskell'in TChan'in Erlang'ın mesaj sıraları gibi mesajları ertelemesi nasıl mümkün olabilir?

-module(testit). 
-export([testit/0]). 

testit() -> 
    Pid = spawn(fun testit_proc/0), 
    Pid ! final, 
    Pid ! one, 
    Pid ! two, 
    io:format("Root finished~n"). 

testit_proc() -> 
    receive 
     one  -> io:format("One~n"); 
     two  -> io:format("Two~n") 
    end, 
    receive 
     one  -> io:format("One~n"); 
     two  -> io:format("Two~n") 
    end, 
    receive 
     one  -> io:format("One~n"); 
     two  -> io:format("Two~n"); 
     final -> io:format("Final~n") 
    end, 
    io:format("Spawn finished~n"). 

Çıktı: final

Root finished 
One 
Two 
Final 
Spawn finished 

final mesajının işlenmesi, bu mesajla uyuşmayan önceki alım kalıpları sayesinde son alma bloğuna kadar esasen ertelenir. .

Bunu Haskell'in TChan ile nasıl yapıyorsunuz?

cevap

3

Erlang'ın seçici alma özelliğinden bahsediyorsunuz. Bildiğim kadarıyla, Haskell'deki STM buna paralel değil. Seçimleriniz, gerekliliğini ortadan kaldırmak için kodunuzu yeniden kodlamak (örneğin, alınabilecek farklı bilgi türleri için ayrı kuyruklar kullanarak) veya bu özelliği bir kitaplıkta uygulamaktır.

Seçmeli alımın semantiği, gelen ileti sırasına ek olarak, ertelenmiş bir ileti listeniz de vardır. Alma işlevinde, önce eşleşen tüm iletiler için ertelenmiş listeyi taramanız gerekir. Bir mesaj eşleşirse, listeden çıkarır ve teslim edersiniz. Ertelenmiş ileti eşleşmezse, gelen kutusunda bir ileti beklemeniz gerekir. Bir mesaj alındığında, eşleşip eşleşmediğini kontrol edersiniz. Eğer yaparsa, teslim edersiniz; değilse, sonra ertelenen listeye itin ve tekrarlayın.

+2

Anlaşıldı. Bu semantikler temel "Chan" veya "TChan" paketlerinde mevcut değildir - bir erteleme sırasını kendiniz uygulamak zorundasınız. –

İlgili konular