为什么我喜欢 Raku
— 焉知非鱼我一直在家里静静地玩着每周挑战,本周的第一个任务是:
写一个脚本,找到第一个至少有5个不同数字的平方数。
解决这个问题的方法是(很明显!)懒洋洋地把每一个数字从1到无穷大的平方,然后梳理每个平方的数字,寻找5个或更多独特的数字,并立即输出你找到的第一个这样的平方。
这就直接翻译成 Raku:
1..∞ ==> map {$^n²} ==> first {.comb.unique ≥ 5} ==> say();
但那个解决方案的优雅并不是我喜欢 Raku 的原因。
我爱 Raku 是因为,如果那个解决方案对你来说太可怕了(太无限、太懒惰、太并发、太管道化、太 Unicode、太声明式、太函数化、太像 Erlang 大师会写的代码),那么 Raku 同样允许你写一个简单的版本:一个命令式的、迭代的、块结构的、变量驱动的、纯 ASCII 的、或多或少完全和你在 Perl 中写的一样的版本,甚至在C中:
loop (my $n=1 ;; $n++) {
my $n_squared = $n ** 2;
my %unique-digits;
for (split '', $n_squared, :skip-empty) {
%unique-digits{$_}++
}
if (%unique-digits >= 5) {
say $n_squared;
last;
}
}
或者你也可以很容易地写出一个介于这两个极端之间的解决方案,无论其复杂程度和分解程度如何,都是你个人舒适区的甜蜜点。比如说:
sub find_special_square {
for 1..Inf -> $n {
return $n²
if $n².comb.unique >= 5
}
}
say find_special_square();
比起我所知道的任何其他语言,Raku 让你以最适合你的方式来写代码,不管你(团队)目前的编码水平如何,也不管你以后会发现哪种风格最可读,因此最容易维护。
这也是我喜欢 Raku 的原因。
by Damian