神秘的中缀运算符

The mysterious infix

瓦迪姆-贝尔曼告诉我们,他开始了一个在控制台中编写图形用户界面(GUI)应用程序的模块。这让我一下子回到了九十年代。看着示例代码,我又有了下一次的回想。如果你需要一个按钮,你需要子类。事实上,如果你需要任何东西,你都需要子类。在一个有词法作用域的动态语言中,这可能真的有用。

看代码可以看到很多很多的 Raku 功能可以使用。我甚至发现了这个宝贝。

$!id = ++⚛$sequence;

这显然不是九十年代的事。那时候真正的程序员只用一个内核就可以完成任何事情!

有几个 Vadim 给我们写的例子,他的模块界面看起来又很像90年代的样子。这让我思考了一段时间,一个"现代"的界面可以是怎样的。在这个过程中,我并没有想出更好的东西,而是踩到了一个 bug

原来 is looser(&infix:<:>) 应该在 %categorically-won't-work 中。不少事情是 wontwork 的,但没有记录下来。幸运的是,有一个变通的方法,可以定义一个新的操作符,这个操作符的优先级比方法名和参数之间的冒号更松。

sub infix:«add»(Parent:D \p, Child:D \c --> Parent:D) is equiv(&infix:<and>) {
    p.add-child: c;
    p
}

$p add Child.new: :birthday("april") add Child.new: :birthday("december");

我们需要做的就是和 and 一样宽松。

add 操作符的用处在我看来是有疑问的,直到我意识到 feed 操作符 不是。然而 Raku 并没有怎么使用它们。我认为下面应该是 dwimmy

my $c = Channel.new;
$c <== "foo";

乐还是有点不完整。不过不怕,我们现在只在版本 e 上!

by gfldex.

comments powered by Disqus