在哪里定义contains(Junction)?

时间:2019-04-04 06:09:14

标签: perl6 perl6-junction

此代码有效:

(3,6...66).contains( 9|21 ).say  # OUTPUT: «any(True, True)␤»

并返回一个Junction。它也是tested,但not documented。 问题是我在任何地方都找不到它的实现。 Str code(也从Cool调用)从不返回Junction(也不采用Junction)。来源中没有其他methods contain。 由于它是自动线程化的,因此可能是在某个地方专门定义的。我不知道在哪里。有帮助吗?

1 个答案:

答案 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之类的潜在问题的讨论。

诸如printput,中缀~.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