2010-07-17 21 views
6

जैसा कि मैं एरलांग सीखता हूं, मैं पूर्व को हल करने की कोशिश कर रहा हूं। 4.1 "" एक इको सर्वर ")" एरलांग प्रोग्रामिंग "पुस्तक (O'Reilly द्वारा) और मुझे एक समस्या है। मेरे कोड इस तरह दिखता है:एरलांग सरल सर्वर समस्या

-module(echo). 
-export([start/0, print/1, stop/0, loop/0]). 

start() -> 
    register(echo, spawn(?MODULE, loop, [])), 
    io:format("Server is ready.~n"). 

loop() -> 
    receive 
     {print, Msg} -> 
      io:format("You sent a message: ~w.~n", [Msg]), 
      start(); 
     stop -> 
      io:format("Server is off.~n"); 
     _ -> 
      io:format("Unidentified command.~n"), 
      loop() 
    end. 

print(Msg) -> ?MODULE ! {print, Msg}. 

stop() -> ?MODULE ! stop. 

Unfortunatelly, मैं कुछ समस्याएं हैं। अपेक्षित कार्यों को चालू करने पर, यह एक नई प्रक्रिया उत्पन्न करता है और "सर्वर तैयार है" संदेश प्रदर्शित करता है। लेकिन जब मैं प्रिंट फ़ंक्शन का उपयोग करने का प्रयास करता हूं (जैसे echo:print("Some message.")., उदाहरण के लिए) मुझे परिणाम मिला, लेकिन यह काम नहीं करता है जैसा मैं चाहता हूं। यह मेरे संदेश को एक सूची के रूप में प्रिंट करता है (एक स्ट्रिंग के रूप में नहीं) और यह

=ERROR REPORT==== 18-Jul-2010::01:06:27 === 
Error in process <0.89.0> with exit value: {badarg,[{erlang,register,[echo,<0.93.0>]},{echo,start,0}]} 

त्रुटि संदेश उत्पन्न करता है। इसके अलावा, मैं एक त्रुटि

** exception error: bad argument 
in function echo:stop/0 

किसी को भी मुझे समझा सकते हो गया, जब मैं echo:stop() द्वारा सर्वर को रोकने की कोशिश, यहाँ क्या हो रहा है? मैं एरलांग के लिए नया हूं और इस समय मुझे समझना मुश्किल लगता है।

+0

स्ट्रिंग्स को एरलांग में सूचियों के रूप में दर्शाया जाता है। – Jonas

+0

बेशक आप सही हैं, लेकिन चूंकि कोई वर्ण नहीं हैं, जिन्हें प्रदर्शित नहीं किया जा सका, यह एक सूची के रूप में क्यों प्रदर्शित होता है, स्ट्रिंग नहीं? लेकिन यह केवल एक चीज है, सबसे महत्वपूर्ण नहीं, समस्या वही रहती है। – Zbigniew

+0

@ हैनिक ने मुख्य समस्या की व्याख्या की है। स्ट्रिंग्स पूर्णांक की सूचियां हैं, इसलिए '" abc "' '97,98,99]' जैसा ही है। तो erlang वास्तव में "पता नहीं" है अगर पूर्णांक की आपकी सूची केवल पूर्णांक या स्ट्रिंग की एक सूची है। प्रारूप स्ट्रिंग में '~ w' का उपयोग करके इसे केवल एक सूची के रूप में प्रिंट करता है। यदि आप '~ p'it का उपयोग करेंगे, तो परीक्षण करेगा यदि पूर्णांक की सूचियां प्रिंट करने योग्य स्ट्रिंग हो सकती हैं और यदि उन्हें स्ट्रिंग के रूप में प्रिंट करें। यह खोल क्या करता है। हां, इसका इरादा था, नहीं, यह कोई बग नहीं है। सूचियों के रूप में तार होने से उन्हें काम करना बहुत आसान हो जाता है। – rvirding

उत्तर

9

अपने loop/0 समारोह print संदेश आप start/0 फिर जो नई प्रक्रिया spawns और यह echo के रूप में फिर से रजिस्टर करने की कोशिश कर कॉल प्राप्त करते हैं। यह आपके सर्वर की मृत्यु का कारण बनता है और नया echo के रूप में पंजीकृत नहीं है, इसलिए आप इसे print/1 फ़ंक्शन द्वारा संदेश भेज नहीं सकते हैं।

loop() -> 
    receive 
     {print, Msg} -> 
      io:format("You sent a message: ~w.~n", [Msg]), 
      loop(); % <-- just here! 
     stop -> 
      io:format("Server is off.~n"); 
     _ -> 
      io:format("Unidentified command.~n"), 
      loop() 
    end. 
+0

बेशक, यह इतना आसान था। बहुत बहुत धन्यवाद, ऐसा लगता है कि मैं थक गया था और स्पष्ट त्रुटि नहीं देखी थी। फिर से धन्यवाद। – Zbigniew

संबंधित मुद्दे