Wait the light to fall

为什么我喜欢 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