从内部访问例程的Capture

jjm*_*elo 6 introspection perl6

一旦被调用,访问子程序Capture的语法是什么?self仅适用于对象,并且&?ROUTINE指的是静态例程,而不是其曾调用的状态.首先,是否可以Capture从内部访问例程?如果是这样,访问它的语法是什么?我看过相关的Synopse,但我找不到办法,如果有的话.

Jon*_*ton 10

没有办法完全按照你的要求去做.虽然概念上的参数是通过形成一个Capture持有它们的对象来传递的,然后由签名解包,因为大多数调用都不Capture存在.由于Perl 6中的每个操作符都是多调度子例程调用,因此调用的性能很重要,并且语言设计使得实现有足够的空间来作弊以实现可接受的性能.

但是,可以明确要求a Capture:

sub foo(|c ($a, $b)) { say c.perl; }
foo(1, 2);
Run Code Online (Sandbox Code Playgroud)

这将捕获参数c,然后将它们解压缩到$a$b强制执行内部签名.

有人可能会意识到,callsame确实找到了一种方法来访问传递它们的参数,即使签名中没有出现Capture.他们需要这样做会导致编译器选择任何包含callsame各种优化的例程,否则这些例程会丢弃发现参数所需的信息.这并不理想,未来很可能会发生变化 - 最有可能找到一种方法潜入|SECRET-CAPTURE签名或类似内容.