Perl不带逗号的多个子参数

Perl不带逗号的多个子参数,perl,Perl,pert是否可以实现以下语法 sub a { my ($first, $second) = @_; print "$first $second"; } sub b { my ($param, $code) = @_; my $res = $code->(); return "$param $res"; } a 'param1' b 'param2' => sub { return "param3" }; #output would be "

pert是否可以实现以下语法

sub a {
    my ($first, $second) = @_;
    print "$first $second";
}

sub b {
    my ($param, $code) = @_;
    my $res = $code->();
    return "$param $res";
}

a 'param1' b 'param2' => sub { return "param3" };
#output would be "param1 param2 param3"

a是sub,它将进入@u'param1'内部,而b(它将进入'param2'和一个subref内部)返回的任何内容。我喜欢在“b”之前没有逗号。有可能吗?

我强烈建议不要这样做。你省略逗号的动机是什么

  • 语言X在这里不需要逗号

    Perl不是X。X可能有很多特性,但Perl没有。这还包括静态类型、缩进敏感解析和Lisp风格的宏。如果你绝对需要X的功能,也许你应该使用X

  • 我正在用Perl编写一个DSL,其中逗号会很烦人

    我意识到这一趋势,即编写复杂的API,这些API看起来像普通文本,并将其称为“DSL”。他们不是;DSL要求您实际解析某些内容。如果您正在编写一个API,它最好是宿主语言中的惯用语言。即使这涉及到逗号之类的错误

  • 我真的很想这样做,不管原因是什么,不管结果多么脆弱

    在这种特殊情况下,我可以编写代码来执行您希望的操作。它使用荒谬且不鼓励的“与格”形式的方法调用(也称为“间接对象表示法”)

    param1
    将是一个类,我们在该类上调用
    a
    方法。参数列表将调用
    b

    use feature 'say';
    
    package param1 {
        sub a {
            my ($first, $second) = @_;
            say "$first $second";
        }
    }
    
    sub b {
        my ($param, $code) = @_;
        my $res = $code->();
        return "$param $res";
    }
    
    a param1 b param2 => sub { "param3" };  # look, optional quotes for param1
    
    当然,这只是
    'param1'->a(b(param2=>sub{'param3'}))
    的语法糖分。它要求您事先知道
    param1
    的所有值,除非您首先创建一个包装第一个参数的对象:

    use feature 'say';
    
    package MyApi {
        sub a {
            my ($first, $second) = @_;
            say "$$first $second";
        }
    }
    
    sub b {
        my ($param, $code) = @_;
        my $res = $code->();
        return "$param $res";
    }
    
    sub api($) { bless \shift() => 'MyApi' }
    
    my $param1 = api 'param1';
    a $param1 b param2 => sub { "param3" };
    
    但这很愚蠢

  • 我仍然想做这件事,但没有那种脆弱的胡说八道。我也不在乎我要付出多少努力来完成这件事

    您可以向Perl解析器添加关键字,以便接管解析。这需要您对Perl的解析器API有一定的了解,并且您的代码不会在较旧的Perl上工作。因为您可能不想用C编写解析器,您可能希望看到类似的内容,但这些模块往往有点不确定。G祝你好运


我强烈建议不要这样做。你省略逗号的动机是什么

  • 语言X在这里不需要逗号

    Perl不是X。X可能有很多功能,但Perl没有。这还包括静态键入、缩进敏感解析和Lisp风格的宏。如果您绝对需要X的功能,也许您应该使用X

  • 我正在用Perl编写一个DSL,其中逗号会很烦人

    我意识到这种趋势,即编写与普通文本相去甚远的复杂API,并将其称为“DSL”。事实并非如此;DSL要求您实际解析某些内容。如果您正在编写API,则最好在宿主语言中使用惯用语。即使这涉及到零星的逗号等

  • 我真的很想这样做,不管原因是什么,不管结果多么脆弱

    在这个特定的例子中,我可以编写代码来做你想做的事情。它使用了荒谬且不受欢迎的“与格”形式的方法调用(也称为“间接对象表示法”)

    param1
    将是一个类,我们在该类上调用
    a
    方法。参数列表将调用
    b

    use feature 'say';
    
    package param1 {
        sub a {
            my ($first, $second) = @_;
            say "$first $second";
        }
    }
    
    sub b {
        my ($param, $code) = @_;
        my $res = $code->();
        return "$param $res";
    }
    
    a param1 b param2 => sub { "param3" };  # look, optional quotes for param1
    
    当然,这只是
    'param1'->a(b(param2=>sub{'param3'}))
    的语法糖分。它要求您事先知道
    param1
    的所有值,除非您首先创建一个包装第一个参数的对象:

    use feature 'say';
    
    package MyApi {
        sub a {
            my ($first, $second) = @_;
            say "$$first $second";
        }
    }
    
    sub b {
        my ($param, $code) = @_;
        my $res = $code->();
        return "$param $res";
    }
    
    sub api($) { bless \shift() => 'MyApi' }
    
    my $param1 = api 'param1';
    a $param1 b param2 => sub { "param3" };
    
    但这很愚蠢

  • 我仍然想做这件事,但没有那种脆弱的胡说八道。我也不在乎我要付出多少努力来完成这件事

    您可以向Perl解析器添加关键字,以便接管解析。这需要您对Perl的解析器API有一定的了解,并且您的代码不会在较旧的Perl上工作。因为您可能不想用C编写解析器,您可能希望看到类似的内容,但这些模块往往有点不确定。G祝你好运

你想要这样的东西的原因可能很有趣。你想要这样的东西的原因可能很有趣。这是第二个原因(创建DSL),但你反对它的理由似乎是有效的。尽管主要是好奇,如果它能做到的话。谢谢!这是第二个原因(创建DSL),但你反对它的论点似乎是正确的。主要是因为好奇,是否能做到。谢谢!