使用百分号作为前缀运算符名称的一部分

时间:2016-09-12 13:50:40

标签: function operators perl6

我认为%of对于函数名称来说比percent-of更具可读性和简洁性。以下是使用较长名称的工作代码。

#!/bin/env perl6

# Quick stats from gene_exp.diff file

sub percent-of
{
    return sprintf('%.1f', (100 * $^a/ $^b).round(0.1));
}

my $total = first-word-from("wc -l       gene_exp.diff ") -1;  # subtract one for the header
my $ok    = first-word-from "grep -c OK  gene_exp.diff";
my $yes   = first-word-from "grep -c yes gene_exp.diff";

put '| total |    OK | OK % |   yes | yes % | yes / OK |';
put "| $total | $ok | { percent-of $ok, $total } | $yes | { percent-of $yes,$total } | { percent-of $yes, $ok } |";



sub first-word-from ( $command )
{
    return ( qqx{ $command } ).words[0];
}

由于我将子例程名称放在其参数之前,我认为这将是一个前缀运算符。所以这就是我认为可以使较短的名称起作用(即使用sub prefix:<%of>来声明函数):

#!/bin/env perl6

# Quick stats from gene_exp.diff file

sub prefix:<%of>
{
    return sprintf('%.1f', (100 * $^a/ $^b).round(0.1));
}

my $total = first-word-from("wc -l       gene_exp.diff ") -1;  # subtract one for the header
my $ok    = first-word-from "grep -c OK  gene_exp.diff";
my $yes   = first-word-from "grep -c yes gene_exp.diff";

put '| total |    OK | OK % |   yes | yes % | yes / OK |';
put "| $total | $ok | { %of($ok, $total) } | $yes | { %of($yes,$total) } | { %of($yes,$ok) } |";

sub first-word-from ( $command )
{
    return ( qqx{ $command } ).words[0];
}

但是我收到以下错误:

| total |    OK | OK % |   yes | yes % | yes / OK |
Too few positionals passed; expected 2 arguments but got 1
  in sub prefix:<%of> at /home/bottomsc/bin/gene_exp_stats line 6
  in block <unit> at /home/bottomsc/bin/gene_exp_stats line 15

我确信我正在尝试的东西是可能的。我看到了比这更疯狂的功能,比如中缀I don't care operator ¯\(°_o)/¯。我究竟做错了什么?在尝试使用括号和不使用括号调用%of时,我得到完全相同的错误,因此这不是问题。

当我正在输入这个问题时,我才意识到我应该尝试遵循example just cited并将其作为中缀运算符并且它可以工作。但是,我仍然很好奇为什么我的前缀操作符代码不起作用。这可能是我非常基本的东西。

更新:

这是作为中缀运算符完成的工作代码。但我仍然对前缀版本的错误感到好奇:

#!/bin/env perl6

# Quick stats from gene_exp.diff file

sub infix:<%of>
{
    return sprintf('%.1f', (100 * $^a/ $^b).round(0.1));
}

my $total = first-word-from("wc -l       gene_exp.diff ") -1;  # subtract one for the header
my $ok    = first-word-from "grep -c OK  gene_exp.diff";
my $yes   = first-word-from "grep -c yes gene_exp.diff";

put '| total |    OK | OK % |   yes | yes % | yes / OK |';
put "| $total | $ok | { $ok %of $total } | $yes | { $yes %of $total } | { $yes %of $ok } |";

sub first-word-from ( $command )
{
    return ( qqx{ $command } ).words[0];
}

2 个答案:

答案 0 :(得分:6)

使用两个参数调用前缀op

左括号仅在函数名称后面被解释为函数调用,而不是在它跟在前缀运算符名称之后。

因此,在您的第二个代码段中,此表达式使用两个参数调用%of运算符:

%of($ok, $total)

相反,它会创建一个包含两个元素的List值,然后将%of运算符应用于该单个List值 - 因此错误消息&#34; {{1} }。

为了将多个参数传递给前缀运算符,您必须调用其完全限定名称:

expected 2 arguments but got 1"

当然,这会否定你的目标,即可读性和简洁性。

使用单个参数

如果您真的想为此使用前缀运算符,可以使其接受单个prefix:<%of>($ok, $total); 参数,并使用List子签名将其解压缩到签名中的两个值:

[ ]

建议

请注意,声明一个看起来像哈希变量的运算符可能会让下一个必须维护代码的人感到困惑(甚至可能是你自己,当你几周后回到它时)。

sub prefix:<%of> ([$a, $b]) { sprintf '%.1f', (100 * $a / $b).round(0.1); } say %of(42, 50); # 84.0 ++等内置前缀运算符将其自身限制为一个或两个非字母符号。 Perl 6对用户定义的运算符没有相同的限制,但请记住,强大的功能带来了很大的责任...... :)

答案 1 :(得分:5)

  

我认为%可能比函数名称的百分比更具可读性和简洁性。

非常不同意,因为这看起来完全像哈希印记。如果我和你一起工作,如果我碰到这个,我会发疯的。 percent-of作为中缀的错误是什么? 5 percent-of 100返回0.05或其他什么?

我读取了被称为哈希的%。在阅读Perl的百万年中,我认为%是一个新定义的运算符意味着&#39;百分比&#39;这样的前缀。因此,鉴于语言,它是不可读的。它简洁并不是一个很好的理由,它具有更大的认知负荷,因此再次不太可读。我不完全确定批评的平衡是什么?除了它的可怕和酷,你可以做到这一点......