gpt4 book ai didi

raku - 为什么 Perl 6 的 unwrap 方法是 Routine 的方法?

转载 作者:行者123 更新时间:2023-12-04 15:07:56 24 4
gpt4 key购买 nike

有一个 unwrap方法,但似乎我应该使用的方式
这不是应该使用的方式。似乎它应该是
独立例程或不同类中的方法。我错过了什么?

看起来它并不关心它的调用者是什么,只要它
获得权利Routine::WrapHandle东西作为论据。在这个
例如,我 wrap一个子程序并取回一个 WrapHandle :

sub add-two-numbers ( $n, $m ) { $n + $m }

sub do-some-stuff ( $n, $m, $o ) {
add-two-numbers( $n max $m, $m max $o );
}

put do-some-stuff( 5, 10, 15 );

# now I want to look into do-some-stuff to see what it's
# passing
my $wraphandle = &add-two-numbers.wrap: {
say "Arguments were (@_[])";
callwith( |@_ );
}

put do-some-stuff( 5, 10, 15 );

然后,我可以创建一个不同且不相关的例程并调用 unwrap对此:
my &routine = sub { 1 };
&routine.unwrap( $wraphandle );

put do-some-stuff( 5, 10, 15 );
unwrap 的调用者似乎是多余的。确实,我可以称它为
类方法,它仍然有效:
Routine.unwrap( $wraphandle );

但是,这似乎应该是一个例程(因为调用者
没关系):
unwrap( $wraphandle ); # doesn't exist

Routine::WrapHandle 上的方法因为那是
行为:
$wraphandle.unwrap;  # but, this method doesn't exist in that class

那么,我对这种方法缺少什么?

最佳答案

猜测是,接口(interface)设计为一种方式(例程保留信息并能够删除“被动”句柄),但实现了另一种方式(句柄已经保存了所有必需的信息,因此它可以自行解包)。

关于 unwrap 的概念也许应该是句柄上的一个方法:实际上是,但该方法被称为 restore , 其中 Routine.unwrap仅代表(cf core/Routine.pm:110..113):

method unwrap($handle) {
$handle.can('restore') && $handle.restore() ||
X::Routine::Unwrap.new.throw
}

如果你想要完整的故事,除了 core/Routine.pm ,还有 Perl6::Metamodel::WrapDispatcher定义于 Perl6/Metamodel/Dispatchers.nqp .从我所见,我猜想的原始设计当然应该可以实现,但是需要有人对这个问题有足够强烈的感觉才能真正做到……

关于raku - 为什么 Perl 6 的 unwrap 方法是 Routine 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43793769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com