在哪里定义contains(Junction)?

jjm*_*elo 8 perl6 perl6-junction

此代码有效:

(3,6...66).contains( 9|21 ).say  # OUTPUT: «any(True, True)?»
Run Code Online (Sandbox Code Playgroud)

并返回Junction。它也经过测试,但没有记录。问题是我在任何地方都找不到它的实现。也从Cool调用的Str代码从不返回Junction(也不采用Junction)。源代码中没有其他方法contain。由于它是自动线程化的,因此可能是在某个地方专门定义的。我不知道在哪里。有什么帮助吗?

rai*_*iph 9

TL; DR Junction自动线程化由单个中央机制处理。我可以在下面解释它。

(问题的主体是从您陷入陷阱开始的,我认为您记录了一两年后。看来,这与您真正提出的要求无关,但我也涵盖了这一点。)

如何处理结点

在哪里定义contains(Junction)?...问题是我在任何地方都找不到[Junctional]实现。...由于它是自动线程化的,因此可能是在某个地方专门定义的。

是。有一种通用机制可以自动将自动线程化应用于所有 P6例程(方法,运算符等),这些例程没有可显式控制Junction参数发生变化的签名。

只有极少数的内置例程具有这些显式的Junction处理签名- print也许是最著名的。用户定义的例程也是如此。

.contains具有任何特殊处理。因此,它是由通用机制自动处理的。

也许我的答案之所以神奇,Junctions匹配两个正则表达式的早期SO 过滤元素的部分,将作为下面对低级详细信息的高级描述而有所帮助。只需用SO 替换您的9|21,用替换您的,这很有道理。foo & bar.containsgrep

拼写代码

我将重点介绍方法。其他例程以类似方式处理。

method AUTOTHREAD 完成全部P6方法的工作。

这是在此代码中设置的,该代码设置了对nqp和完整P6代码的处理

上面链接的P6安装代码依次调用setup_junction_fallback

当用户程序中发生方法调用时,它涉及调用find_method(如代码上面的注释中所述,对缓存高速缓存命中进行模块化;请注意,该注释中使用“ fallback”一词与缓存未命中有关,这在技术上是不相关的到此代码中显而易见的其他后备机制,我们一直在研究)。

代码这附近的结束位find_method手柄(非高速缓存未命中)回退。

其到达find_method_fallback开始关闭其与实际结搬运东西。

陷阱

此代码有效:

(3,6...66).contains( 9|21 ).say  # OUTPUT: «any(True, True)?»
Run Code Online (Sandbox Code Playgroud)

它也可以做到的程度“起作用”:

(3,6...66).contains( 2 | '9 1' ).say  # OUTPUT: «any(True, True)?»
Run Code Online (Sandbox Code Playgroud)

请参阅列表变成字符串,所以要当心.contains()和/或讨论诸如pmichaud的注释之类的潜在问题。

例程喜欢printput,中缀~,并.contains例程。那意味着他们强迫他们争辩Str。默认情况下,.Str强制值的强制性是其元素之间用空格分隔:

put 3,6...18;                    # 3 6 9 12 15 18
put (3,6...18).contains: '9 1';  # True
Run Code Online (Sandbox Code Playgroud)

还经过测试

大概是指两个测试的*.contains参数传递给classify

my $m := @l.classify: *.contains: any 'a'..'f';
my $s := classify *.contains( any 'a'..'f'), @l;
Run Code Online (Sandbox Code Playgroud)

例程喜欢classify列表程序。尽管某些列表例程对它们的列表参数/调用者执行单个操作,例如push,其中的大多数(包括classify)都遍历其列表,对列表中的每个元素执行某些操作。

给定一个序列调用者/参数,classify将对其进行迭代并将每个元素传递给测试,在这种情况下为a *.contains

然后,后者将强制单个元素转换Str。与您的示例相比,这是一个根本的区别,该示例可以一次执行一个序列Str

  • 我刚回到网上。我还没有时间意识到任何事情。:)文档说:“当结点绑定到不接受结点类型值的参数时,就会发生自动线程化。不产生错误,而是对结点的每个值重复签名绑定。” 对我来说基本上就是这样。其余的主要是对该机制的简单性,通用性和强大性进行了解释-我目前看到的文档情况更像是Forrest Gumpian盒装巧克力中缺少菜单,而不是Pandora盒装。:) (2认同)