此代码有效:
(3,6...66).contains( 9|21 ).say # OUTPUT: «any(True, True)»
并返回一个Junction
。它也是tested,但not documented。
问题是我在任何地方都找不到它的实现。 Str code(也从Cool调用)从不返回Junction(也不采用Junction)。来源中没有其他methods contain
。
由于它是自动线程化的,因此可能是在某个地方专门定义的。我不知道在哪里。有帮助吗?
答案 0 :(得分:8)
TL; DR 交接自动线程由单个中央机制处理。我可以在下面解释它。
(问题的主体是从您陷入一个陷阱开始,我认为您记录了一年或两年。这似乎与您的真正要求无关,但我也涵盖了这一点。)
在哪里定义contains(Junction)? ...问题是我在任何地方都找不到[Junctional]实现。 ...由于它是自动线程化的,因此可能是在某个地方专门定义的。
是的。有一种通用机制可以自动将自动线程应用于所有 P6例程(方法,运算符等),这些例程没有签名来显式控制Junction
参数的情况。
只有极少数的内置例程具有这些显式的Junction
处理签名-print
也许是最著名的。用户定义的例程也是如此。
.contains
没有没有任何特殊处理。因此,它是由通用机制自动处理的。
也许my answer to an earlier SO Filtering elements matching two regexes的 Junctions
的魔力作为对下面介绍的低级详细信息的高级描述会有所帮助。只需将您的9|21
替换为foo & bar
,并将.contains
替换为grep
,就可以了。
我将重点介绍方法。其他例程的处理方式与此类似。
method AUTOTHREAD
完成了全部P6方法的工作。
这是在this code that sets up handling for both nqp and full P6 code中设置的。
上面链接的P6设置代码依次调用setup_junction_fallback。
在用户程序中发生方法调用时,它涉及到调用find_method
(如代码上面的注释中所述,对高速缓存命中进行模式;请注意,该注释中的“ fallback”一词的使用涉及缓存未命中-从技术上讲,与我们正在研究的这段代码中显而易见的其他回退机制无关。
bit of code near the end of this find_method
处理(非缓存丢失)回退。
到达find_method_fallback
的地方是从实际的交汇处开始的。
此代码有效:
(3,6...66).contains( 9|21 ).say # OUTPUT: «any(True, True)»
它也可以做到这一点:
(3,6...66).contains( 2 | '9 1' ).say # OUTPUT: «any(True, True)»
请参见Lists become strings, so beware .contains()
和/或诸如pmichaud's comment之类的潜在问题的讨论。
诸如print
,put
,中缀~
和.contains
之类的例程是 string 例程。这意味着他们将其论点强制为Str
。默认情况下,列表值的.Str
强制是其元素由空格分隔:
put 3,6...18; # 3 6 9 12 15 18
put (3,6...18).contains: '9 1'; # True
它也经过测试
大概是指两个带有*.contains
参数传递给classify
的测试:
my $m := @l.classify: *.contains: any 'a'..'f';
my $s := classify *.contains( any 'a'..'f'), @l;
像classify
这样的例程是 list 例程。尽管某些列表例程对列表参数/调用者执行单个操作,例如push
,但大多数列表例程(包括classify
)都在列表中进行迭代,以对每个元素进行处理/ 每个元素在列表中。
给出序列调用者/参数,classify
将对其进行迭代,并将每个元素传递给测试,在这种情况下为*.contains
。
后者将随后将单个元素强制为Str
。与您的示例相比,这是一个根本的区别,该示例可以一次将一个序列强制为Str
。