此代码有效:
(3,6...66).contains( 9|21 ).say # OUTPUT: «any(True, True)»
并返回
Junction
。它也是tested,但是not documented。问题是我在任何地方都找不到它的实现。 Str code也从Cool调用,它从不返回Junction(也不采用Junction)。源代码中没有其他methods
contain
。由于它是自动线程化的,因此可能是在某个地方专门定义的。我不知道在哪里。有什么帮助吗?
最佳答案
TL; DR 交汇点自动线程化由单个中央机制处理。我可以在下面解释它。
(问题的主体是从您陷入困境开始的,我认为您记录了一两年或两年。这似乎与您真正提出的要求无关,但我也涵盖了这一点。)
如何处理结点
是的。有一种通用机制可以自动将自动线程化应用于所有P6例程(方法,运算符等),这些例程没有可显式控制Junction
参数发生的签名。
只有极少数的内置例程具有这些显式的Junction
处理签名-print
也许是最著名的。用户定义的例程也是如此。.contains
没有任何特殊处理。因此,它是由通用机制自动处理的。
也许部分my answer to an earlier SO Filtering elements matching two regexes的Junctions
的魔力作为对下面介绍的低级详细信息的高级描述会有所帮助。只需在该SO中将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
,infix ~
和.contains
这样的例程都是字符串例程。这意味着他们将其参数强制转换为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
这样的例程是列表例程。尽管某些列表例程对它们的列表参数/调用者执行单个操作,例如push
,但它们中的大多数(包括classify
)都会遍历其列表,对列表中的每个元素执行某些操作。给定一个序列调用者/参数,
classify
将对其进行迭代并将每个元素传递给测试,在这种情况下为*.contains
。然后,后者将把各个元素强制转换为
Str
。与您的示例相比,这是一个根本的区别,该示例可以一次将一个序列强制为Str
。关于raku - 在哪里定义contains(Junction)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55508965/