Yet Another Post on "Pascal Triangle"

又名:如何用一行Perl 6打印杨辉三角前n行。

此时开始到目前为止,网上至少有三篇关于如何用Perl 6打印杨辉三角的文章:这里(TimToady), 这里(Moritz), 和 这里(Masak)。

"There's more than one way to do it.",好吧,我也来写一个,下面这行代码打印杨辉三角的前10行:

([1], -> @p { 0, @p Z+ @p, 0 } ... *).[^10].perl.say;
(......多少都有些抄袭的嫌疑,其实就是直接拼成一行了,不是吗?:))


简单解释下:

"infix:<...>"称为"Series Operator"(S03),相当于把对一个块的求值结果push到最前面的List里面,直到满足右边的条件为止。比如:

(1, {$_ + 1} ... 5).perl.say;
→ (1, 2, 3, 4, 5)


"*"在这里是一个被叫做"Whatever"(S02)的东西,在这里起构造惰性求值列表的作用。

中间自"-> { }"起,是一个由"->"(S06)构造的轻量型匿名函数块,即要应用("apply")的部分。类似于Perl 5中"map BLOCK LIST"的"BLOCK"。同时,"Z+ Operator"(S03)将两边列表结对相加。关于此操作符的用法举例如下:

(1, 2, 3 Z+ 4, 5, 6).perl.say;
→ (5, 7, 9)

额外一提:"Z+"属于"Zip Operator"系列,类似的还有"Z~",可以用它实现成对字符串拼接:

(1, 2, 3 Z~ 4, 5, 6).perl.say;
→ ("14", "25", "36")

现在,把代码中的"10"改成需要打印的行数,就可以实现"用一行Perl 6打印杨辉三角前n行"了。:)

顺便说下,现在想试试Perl 6的话用不着安装,直接Try Rakudo

Leave a comment

About pid

user-pic I blog about Perl.