Можете ли вы клонировать Perl 6 Proc? - PullRequest
0 голосов
/ 26 апреля 2018

Я играл с этим в 2018.01:

my $proc = Proc.new: :out;
my $f = $proc.clone;
$f.spawn: 'ls';
put $f.out.slurp;

Он говорит, что не может этого сделать. Любопытно, что сообщение об ошибке касается подпрограммы, которую я не использовал, и другого класса:

Cannot resolve caller stdout(Proc::Async: :bin); none of these signatures match:
    (Proc::Async:D $: :$bin!, *%_)
    (Proc::Async:D $: :$enc, :$translate-nl, *%_)
  in block <unit> at proc-out.p6 line 3

1 Ответ

0 голосов
/ 27 апреля 2018

Все наследует метод clone по умолчанию от Mu, который делает поверхностное клонирование, но это не значит, что все имеет смысл клонировать. Это особенно касается объектов, которые могут содержать ссылки на вещи уровня ОС, такие как Proc или IO::Handle. Как человек, который разработал Proc::Async, я могу с уверенностью сказать, что заставить его делать что-то полезное на clone не было соображением дизайна. Я не проектировал Proc, но подозреваю, что то же самое применимо.

Что касается ошибки, имейте в виду, что стандартная библиотека Perl 6 реализована в Perl 6 (во многом как в Java и .Net, но не так, как в Perl 5, где многие вещи, которые предоставляются по умолчанию, идут непосредственно к чему-то написанному в с). В данном конкретном случае Proc реализован в терминах Proc::Async. Rakudo пытается несколько обрезать трассировки стека, чтобы исключить вызовы внутри параметра, что обычно является преимуществом для пользователя языка, но в таких случаях это может быть немного менее полезно. Запуск Rakudo с флагом --ll-exception предоставляет полную информацию и, таким образом, проясняет происходящее.

...