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。由于它是自动线程化的,因此可能是在某个地方专门定义的。我不知道在哪里。有什么帮助吗?
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的注释之类的潜在问题。
例程喜欢print,put,中缀~,并.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。