server - perl6 Changes in IO::Socket::INET from last year and broken promises -


when asked question last year promises, echo server working (see link: perl6 how specific identity of promises? ). however, new versions of perl6, echo server no longer working.

i guess can try example perl6 documentation site ( https://docs.perl6.org/type/io::socket::inet ), want find out mistake have made in code. current level has precluded me seeing difference between codes , codes on perl6 documentation site. please give me hint; !

my @result;  0 .. 2 -> $index {   @result[$index] = start {     $mypromiseid = $index;      "======> $mypromiseid\n";      $rssocket = io::socket::inet.new:     localhost => 'localhost',     localport => 1234 + $index,     listen    => 1;      while $rssocket.accept -> $rsconnection {         "promise $mypromiseid accepted connection";         while $rsconnection.recv -> $stuff {         "promise $mypromiseid echoing $stuff";         $rsconnection.print($stuff);         }         $rsconnection.close;     }   } }  await @result; 

and error messages are:

tried result of broken promise   in block <unit> @ p6echomulti.pl line 24  original exception:     nothing given new socket connect or bind       in block  @ p6echomulti.pl line 8  thrown at:   in block  @ p6echomulti.pl line 13 

this commit, announced in jan 2017 section of rakudo's changelog "fixed bug ipv6 uris not parsed correctly" did lot more fix uri parsing bug. redid parameter binding/validation of io::socket::inet.new call, , 1 consequence broke code because updated code requires listen actual bool, not merely coerce one.


the old code (the code on left of commit link above) had simple method new (*%args copy). matched call. error (fail "nothing given new socket connect or bind to") did not trigger because 1 evaluates true in boolean context %args<host> || %args<listen> true. rest of code ran listen set 1 , worked out fine.

rakudos 2017.01 have code on right @ commit link above. note how there multiple new methods (i.e. multiple multi method new ... declarations).

the multi(s) intended handle call specifies listen argument is/are of form multi method new (..., bool:d :$listen!, ...). note bool:d.

a call new, listen parameter set true, matches multi , works expected.

but call :listen(1) match generic multi method new (*%args) signature instead. latter unconditional fail "nothing given new socket connect or bind to";.


Comments

Popular posts from this blog

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -