Modula-3のお勉強。
TCPモジュールを使ってエコーサーバー(受信した内容をそのまま送り返す)を作ってみる。
(* Main.m3 *)
MODULE Main;
IMPORT TCP,IP,ConnRW;
IMPORT Rd,Wr, IO, Text;
VAR con :TCP.Connector;
VAR server :TCP.T;
VAR endpoint :IP.Endpoint;
VAR addr :IP.Address;
VAR rd: Rd.T;
VAR wr: Wr.T;
BEGIN
EVAL IP.GetHostByName("localhost",addr);
endpoint := IP.Endpoint{addr,9999};
con := TCP.NewConnector(endpoint);
IO.Put(IP.GetCanonicalByAddr(IP.GetHostAddr()));
IO.Put("Addr:");
IO.PutInt(endpoint.addr.a[0]);
IO.Put(".");
IO.PutInt(endpoint.addr.a[1]);
IO.Put(".");
IO.PutInt(endpoint.addr.a[2]);
IO.Put(".");
IO.PutInt(endpoint.addr.a[3]);
IO.Put("\nPort:");
IO.PutInt(endpoint.port);
IO.Put("\n");
LOOP
server := TCP.Accept(con);
rd := ConnRW.NewRd(server);
wr := ConnRW.NewWr(server);
LOOP
WITH com = IO.GetLine(rd) DO
IF Text.Equal(com,"quit") THEN
EXIT;
END;
IO.Put(com & "\n", wr);
IO.Put(com);
IO.Put("\n");
END;
END;
Rd.Close(rd);
Wr.Close(wr);
TCP.Close(server);
END;
END Main.
(* m3makefile *)
import("libm3")
import("tcp")
implementation("Main")
program("echoserv")
例外処理を書いてないあたり問題かもしれないが、とりあえず動くと思われる。ぶっちゃけ、処理系のexamplesにあるHTTPDの劣化版です。
IP.GetHostAddr()の返り値が、どうも127.0.1.1になってるっぽいのでIP.GetHostByName()を使った。
以下、今回のModula-3プログラムについてのメモ
- 手続きは返り値を返すものと返さないものの2種類
- 返り値を返す手続き(function procedure)の返り値が不要な場合、EVALを使う
- 手続きの引数には3種類のモードがある
- VALUEがデフォルトの動作で、値渡し
- VARは参照渡し
- READONLYは参照渡しだが、値を変更しない。巨大なデータ構造などを引数とする場合に利用する。
- 参照渡し、といってもREF型を引数に渡すわけではなさそう。
- WITHはDOからENDまでのスコープから見える変数を導入する
- LOOPは無限ループ。EXITで抜け出す
0 件のコメント:
コメントを投稿