此代码有效:

(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 regexesJunctions 的魔力作为对下面介绍的低级详细信息的高级描述会有所帮助。只需在该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之类的基本问题的讨论。

printput,infix ~.contains这样的例程都是字符串例程。这意味着他们将其参数强制转换为Str。默认情况下,列表值的.Str强制是其元素,以空格分隔:
put 3,6...18;                    # 3 6 9 12 15 18
put (3,6...18).contains: '9 1';  # True



大概是用传递给*.containsclassify参数的两个测试:
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/

10-12 20:22