【发布时间】:2018-03-25 21:36:20
【问题描述】:
调用子例程 Capture 后访问它的语法是什么? self 仅适用于对象,&?ROUTINE 指的是静态例程,而不是其调用后的状态。那么首先,是否可以从内部访问例程的Capture?如果是这样,访问它的语法是什么?我查看了related Synopse,但找不到方法,如果有的话。
【问题讨论】:
标签: introspection raku
调用子例程 Capture 后访问它的语法是什么? self 仅适用于对象,&?ROUTINE 指的是静态例程,而不是其调用后的状态。那么首先,是否可以从内部访问例程的Capture?如果是这样,访问它的语法是什么?我查看了related Synopse,但找不到方法,如果有的话。
【问题讨论】:
标签: introspection raku
没有办法完全按照您的要求去做。虽然从概念上讲,参数是通过形成一个持有它们的Capture 对象来传递的,然后由签名解包,但对于大多数调用来说,实际上并不存在Capture。由于 Perl 6 中的每个运算符都是多分派子例程调用,因此调用的性能很重要,并且语言设计使得实现有足够的空间进行欺骗以达到可接受的性能。
可以明确要求Capture,但是:
sub foo(|c ($a, $b)) { say c.perl; }
foo(1, 2);
这会将参数捕获到c,然后将它们也解压缩到$a 和$b,强制执行该内部签名。
人们可能会意识到像callsame 这样的东西确实找到了一种方法来访问参数以传递它们,即使签名中没有出现 Capture。他们这样做的需要导致编译器从各种优化中选择任何包含callsame 的例程,否则会丢弃发现参数所需的信息。这并不理想,而且很可能在未来会发生变化 - 很可能是通过找到一种方法将 |SECRET-CAPTURE 偷偷带入签名或类似内容中。
【讨论】: