Archive for 12月, 2007

あどばんすど NScLisper オフィシャルガイド

土曜日, 12月 29th, 2007

zickです。
リリカル☆Lispの通販特典としていた
『あどばんすど NScLisper オフィシャルガイド』
を一般公開しようかと思います。
こちらからご自由にお持ち帰り下さい。
内容はNScripterでのLispインタプリタの作り方をかなり大雑把に書いてあるという感じです。
テキトーなことを書いてあるので鵜呑みにしないようにしてください(笑)

Erlangで毒電波送信

木曜日, 12月 6th, 2007

お久しぶりです。zickです。
数日前、『Lispの歌』という言葉を目にし、一体何なのかと思ったら、
『かっこうの歌』のことだったんですね。(「かっこう→括弧」という洒落)
某所でネタとしてLisperが実際に歌った由緒正しきモノだそうです。

話は変わりますが、相変わらずErlang触ってます。
それで、今はソケットの勉強をしているのですが、
練習という名目で毒電波(SSTP)を飛ばしてみました。

即席で作った怪しげなスクリプトを読み込んで、それに基づいてErlangがSSTPを飛ばします。
毒電波を飛ばしているErlangの関数はこんな感じです。

send_and_receive(Str) ->
{ok,Sock} = gen_tcp:connect("localhost", 9801, [binary, {packet, 0}]),
ok = gen_tcp:send(Sock, Str),
receive_data(Sock, []).
receive_data(Sock, SoFar) ->
receive
{tcp,Sock,Bin} ->
receive_data(Sock, [Bin|SoFar]);
{tcp_closed,Sock} ->
list_to_binary(lists:reverse(SoFar))
end.
send_sstp(Body, Ver, Retry) ->
Header = "SEND SSTP/"++Ver++"\r\n"
"Sender: "++?SENDER++"\r\n"
++Body++
"Charset: "++?CHAR_SET++"\r\n\r\n",
case {Retry, send_and_receive(Header)} of
{true, <<"SSTP/1.1 409",_/binary>>} ->
timer:sleep(2000),
send_sstp(Body, Ver, Retry);
{_, Any} ->
Any
end.

怪しげなスクリプトはこんな感じ。

%ラベルは*から始まり、命令は^から始まります
%字句は全て改行区切りという不気味な作りです(笑)
*start
\h\s0電波、\w8届いた?
届いた
届いてない
わからない
^list_speak
届いた
arrive
^eq_jump
わからない
not_understand
^eq_jump
\h\s0それじゃあ、もう一度送るね\w8…\w8…そりゃ!
^next_speak
start
^jump
*arrive
\u\s0いや、むしろErlangから毒電波がこっちに届いてるんだけど
^normal_speak
^exit
*not_understand
\h\s0聞くは一時の恥、聞かぬは一生の恥。わからないことは悪いことじゃないよ\uどーでもいい\e
^normal_speak
^exit