2010-07-17 53 views
6

Khi tôi học Erlang, tôi đang cố gắng giải quyết vấn đề cũ. 4.1 ("Máy chủ Echo") từ sách "Lập trình Erlang" (bởi O'Reilly) và tôi gặp sự cố. Mã của tôi trông giống như sau:Erlang Vấn đề máy chủ đơn giản

-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, tôi có một số vấn đề. Bật các công trình như mong đợi, nó sẽ sinh ra một quy trình mới và hiển thị thông báo "Máy chủ đã sẵn sàng". Nhưng khi tôi cố gắng sử dụng chức năng in (ví dụ như echo:print("Some message.").), tôi nhận được kết quả, nhưng nó không hoạt động như tôi muốn. Nó in thông điệp của tôi dưới dạng danh sách (không phải là chuỗi) và nó tạo ra các thông báo lỗi

=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}]} 

. Hơn nữa, khi tôi cố gắng để ngăn chặn máy chủ bằng cách echo:stop() tôi nhận được một lỗi

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

thể ai giải thích cho tôi, những gì đang xảy ra ở đây? Tôi mới làm quen với Erlang và có vẻ như rất khó nắm bắt cho tôi vào lúc này.

+0

Chuỗi được trình bày dưới dạng danh sách trong erlang. – Jonas

+0

Tất nhiên bạn nói đúng, nhưng vì không có ký tự, không thể hiển thị, tại sao nó hiển thị dưới dạng danh sách, không phải là chuỗi? Nhưng đây chỉ là một điều, không phải là quan trọng nhất, vấn đề vẫn giữ nguyên. – Zbigniew

+0

@Hynek đã giải thích vấn đề chính. Chuỗi là danh sách các số nguyên, vì vậy '" abc "' giống với '[97,98,99]'. Vì vậy, erlang không thực sự "biết" nếu danh sách các số nguyên của bạn chỉ là một danh sách các số nguyên hoặc một chuỗi. Sử dụng '~ w' trong một chuỗi định dạng chỉ in ra dưới dạng danh sách. Nếu bạn sử dụng '~ p'it sẽ kiểm tra xem các danh sách các số nguyên có thể là các chuỗi có thể in được và nếu có thì in chúng thành các chuỗi. Cái vỏ này làm gì. Vâng, điều này đã được dự định, không có nó không phải là một lỗi. Có chuỗi như danh sách làm cho chúng rất dễ làm việc. – rvirding

Trả lời

9

Khi chức năng loop/0 của bạn nhận được print tin nhắn bạn gọi start/0 lần nữa để sinh ra quy trình mới và cố gắng đăng ký lại thành echo một lần nữa. Nó khiến máy chủ của bạn bị chết và máy chủ mới không được đăng ký là echo, vì vậy bạn không thể gửi tin nhắn tới máy chủ theo chức năng print/1 nữa.

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

Tất nhiên, điều đó thật đơn giản. Cảm ơn bạn rất nhiều, có vẻ như tôi đã mệt mỏi và không nhận thấy lỗi rõ ràng. Cám ơn bạn một lần nữa. – Zbigniew

Các vấn đề liên quan