package R2::Guile; use POE; use strict; use Inline Guile => < ".(ref $args[$_])."\r\n"; } my (@info) = $package->spawn(@args); $_[KERNEL]->yield('message', $_[ARG0], @info); } sub new_thread { #if ref($_[ARG1] ne 'Guile::SCM') { create_thread($_[KERNEL], $_[ARG1]); $_[KERNEL]->yield('message', $_[ARG0], $_[ARG1]); } sub create_thread { my ($kernel, $guile) = @_; my $r = catchwrap($guile); send_event($kernel,$r); } sub eval_perl { my $ret = eval $_[ARG1]; $ret = $@ if $@; $ret ||= 0; $_[KERNEL]->yield('message', $_[ARG0], $ret); } sub thread_exit { } sub thread_error { warn ('Error in Guile thread', $_[ARG0..$#_]); } sub foo { $_[KERNEL]->yield('message', $_[ARG0], "Foo!"); } sub message { my $r = postreturn($_[ARG0],$_[ARG1]); send_event($_[KERNEL],$r); } sub send_event { my ($kernel, $r) = @_; my ($kont, $session, $message, @args) = @$r; #my ($session, $message, @args) = @$a; #foreach (@args) { # next unless Guile::list_p($_); # $_ = @{$_}; #} #print "$session $message\n"; $kernel->post($session, $message, $kont, @args); } sub spawn { return POE::Session->create( package_states => [ 'R2::Guile' => [ '_start', 'new_thread', 'session_spawn', 'message', 'foo', 'eval_perl', 'thread_exit', 'thread_error' ] ] ); } sub _start { $_[KERNEL]->alias_set('guile'); create_thread($_[KERNEL], [ Guile::lookup('r2-start') ]); } sub R2::run { $poe_kernel->run(); } 1;