我们能想到Perl 6的结点有什么用?
时间:2020-03-06 14:26:11 来源:igfitidea点击:
来自Perl 6 Wikipedia条目的更多信息
交界处
Perl 6引入了结点的概念:由其他值组成的值。[24]在Perl 6的设计之初,这些被称为"叠加",类似于量子叠加波形的量子物理学中的概念,这些波形可以同时占据多个状态,直到观察"折叠"它们。 Damian Conway在2000年发布的Perl 5模块称为Quantum :: Superpositions [25]提供了概念的初步证明。最初,这种叠加值似乎只是程序上的好奇心,随着时间的流逝,它们的实用性和直观性得到了广泛认可,并且连接现在在Perl 6的设计中占据中心位置。
最简单的形式是通过将一组值与强制运算符组合来创建结点:
my $any_even_digit = 0|2|4|6|8; # any(0, 2, 4, 6, 8) my $all_odd_digits = 1&3&5&7&9; # all(1, 3, 5, 7, 9)
|指示等于其左或者右参数的值。 &表示一个等于其左手参数和右手参数的值。这些值可以在任何使用常规值的代码中使用。在联结上执行的操作均等地作用于联结的所有成员,并根据逻辑运算符组合。因此,(" apple" |" bananas")〜" s"将产生" apples" |" bananas"。在比较中,结点将为比较返回一个正确或者错误的结果。如果对联结的任何元素的比较为真,则"任意"联结将返回真。如果对联结的所有元素的比较为真,则"所有"联结将返回真。
通过引入约束到类型的结点的通用编程样式,结点也可以用于更丰富地扩展类型系统:
sub get_tint ( RGB_Color|CMYK_Color $color, num $opacity) { ... } sub store_record (Record&Storable $rec) { ... }
解决方案
给定月份多少天?
given( $month ){ when any(qw'1 3 5 7 8 10 12') { $day = 31 } when any(qw'4 6 9 11') { $day = 30 } when 2 { $day = 29 } }
结点最吸引人的功能是,我们无需为复杂情况编写大量代码测试。我们用路口描述情况,然后进行测试。我们不必考虑如何获得答案(例如,使用短路运算符或者是否阻塞),而是要问什么问题。
自动线程听起来很酷,尽管我不知道它的当前状态。
for all(@files) -> $file { do_something($file); }
结点没有顺序,因此VM可以自由为@files中的每个元素生成一个线程并并行处理它们。