包含(连接点)在哪里定义?

问题描述 投票:8回答:1

此代码有效:

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

并返回一个Junction。这也是tested,但not documented。问题是我无法在任何地方找到它的实现。 Str code也是从Cool调用的,它永远不会返回一个Junction(它也不会使用Junction)。源头上没有其他methods contain。由于它是自动编程的,它可能是在某处特别定义的。但我不知道在哪里。有帮助吗?

perl6 perl6-junction
1个回答
9
投票

TL; DR Junction自动读取由单个中央机制处理。我在下面解释一下。

(你的问题的主体开始于你陷入一个陷阱,我认为你记录了一两年回来。这似乎与你真正要求的东西无关,但我也覆盖了它。)

How junctions get handled

包含(连接点)在哪里定义? ...问题是我无法在任何地方找到[Junctional]实现。 ...因为它是自动编程的,所以它可能是在某处特别定义的。

是。有一种通用机制可以自动将自动编程应用于所有P6例程(方法,运算符等),这些例程没有明确控制Junction参数的签名。

只有极少数内置例程具有这些明确的Junction处理签名 - print可能是最值得注意的。用户定义的例程也是如此。

.contains没有任何特殊处理。因此它由通用机制自动处理。

也许Junctionsmy answer to an earlier SO Filtering elements matching two regexes的魔法部分将有助于作为对下面的低级细节的高级描述。只需用你的9|21替换那个SO中的foo & bar,然后用你的.contains代替grep,它有希望有意义。

Spelunking the code

我将专注于方法。其他例程以类似的方式处理。

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,从实际的交叉处理开始。

A trap

此代码有效:

(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的论点。默认情况下,listy值的.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的示例相比,这是一个根本区别。

© www.soinside.com 2019 - 2024. All rights reserved.