IRC botを駆使すると捗るらしいので手始めにlleval bot作った
Yokohama.pm#8でのYappoの話によれば、IRC botを駆使すると捗るらしい。
IRC botは作ったことがなかったので練習としてllevalを実行するbotを作ってみた。botのフレームワークとしてはAnySanを使い、llevalへのアクセスはLLEval-Clientを使った。
https://github.com/gfx/LLEval-Client/blob/master/example/irc-bot.pl
#!perl -w use strict; use 5.10.0; use AnySan; use AnySan::Provider::IRC; use LLEval; use Encode qw(encode_utf8 decode_utf8); use constant _DEBUG => $ENV{LLEVAL_BOT_DEBUG}; use if _DEBUG, 'Data::Dumper'; my $lleval = LLEval->new(); my %languages = %{$lleval->languages}; my $langs = '(?:' . join('|', map { quotemeta } keys %languages) . ')'; my $irc = irc 'chat.freenode.net', nickname => 'lleval', channels => { '#lleval' => { }, }; sub receiver { my($r) = @_; my($lang, $src) = $r->message =~ /\A ($langs) \s+ (.+)/xms or return; say "$lang $src" if _DEBUG; my $result = $lleval->call_eval( decode_utf8($src), $lang ); if(_DEBUG) { say Data::Dumper->new([$result]) ->Indent(1) ->Sortkeys(1) ->Quotekeys(0) ->Useqq(1) ->Terse(1) ->Dump(); } if(defined(my $s = $result->{stdout})) { $r->send_reply($_) for split /\n/, encode_utf8($s); } # error? if($result->{status}) { $r->send_reply("$languages{$lang} returned $result->{status}!!"); } if($result->{error}) { $r->send_reply("error: $result->{error}"); } if(defined(my $s = $result->{stderr})) { $r->send_reply($_) for split /\n/, encode_utf8($s); } } AnySan->register_listener( echo => { cb => \&receiver, }, ); AnySan->run; __END__
使い方はこんな感じ:
22:15 gfx: pl print "Hello" 22:15 lleval: Hello 22:16 gfx: c int main() { printf("Hello, world!"); return 0; } 22:16 lleval: Hello, world! 22:18 gfx: bf ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. 22:18 lleval: Hello World! 22:22 gfx: hs main = putStrLn "Hello, Haskell!" 22:22 lleval: Hello, Haskell!