【问题标题】:Passing regexes as arguments in Perl 6在 Perl 6 中将正则表达式作为参数传递
【发布时间】:2017-11-10 13:56:38
【问题描述】:

this question 的延续,可能更奇怪。

我可以吗?使用sub 连接两个regexes? (当然,我明白,用regex怎么办)

以下代码完全错误,但我希望它能解释我想要做什么:

my Regex sub s12 ( $c, $v) {
   return / <{$c}> <{$v}> /
}

my regex consonant { <[a .. z] -[aeiou]>  }
my regex vowel { <[aeiou]> }

my regex open_syllable { &s12( &consonant, &vowel ) }

"bac" ~~ m:g/ <open_syllable> /;
say $/; # should be 'ba'

【问题讨论】:

  • 你试过了吗:my regex open_syllable { $(s12( &amp;consonant, &amp;vowel )) }
  • 您是否只是在语法上遇到了问题,或者您是否试图在不让 rakudo 在解释正则表达式时变慢的情况下完成这项工作?因为您可以完全按照您展示的方式执行此操作,语法略有不同。
  • 您的意思是要编写一个函数,使用核心编译器方法来解释每个正则表达式是什么,并将它们连接到较低级别? (这很有趣,但我不知道怎么做。)另外,这听起来像是EVAL 的一个可接受的用例。要么编写执行某种编译的代码,要么显式调用编译器。
  • 我还在为语法而苦苦挣扎。一旦我达到我的 p6,我就会测试这个建议。

标签: raku


【解决方案1】:

你写的基本上是对的,但是你需要稍微调整一下语法。首先,您应该像任何其他子一样声明您的组合函数。接下来,似乎将一个正则表达式插入另一个,&lt;$r&gt; 是正确的语法,而要将函数调用插入一个正则表达式,&lt;{my-sub(args)}&gt; 是正确的语法。 (调用时不需要在 sub 前面加上 & 符号——&amp; 主要用于当你想引用 Callable 而不调用它时。)结合这些小修复,你的代码就可以工作了:

sub combine(Regex $a, Regex $b --> Regex) {
    / <$a> <$b> /
}

my regex consonant { <[a .. z] -[aeiou]>  }
my regex vowel { <[aeiou]> }

my regex open_syllable { <{combine(&consonant, &vowel)}> }

"bac" ~~ m:g/ <open_syllable> /;
say ~$/; # output: ba

【讨论】:

  • 哇!这将使我免于手动输入许多替代案例! (虽然我想会有其他问题)
  • @piojo Nit:我认为 returns 计划被弃用 -- "This form is planned for future removal."
  • @raiph 太棒了!我从不喜欢有两种语法来指定返回类型。我更新了代码。
  • @piojo :) 我希望你不介意我堆积一些小东西......“是两种语法”s/were/are/ returns 仍然是接受的语法,没有弃用警告,并且在6.d prep 中没有提到它的删除。我为写“预定”道歉。 s/two/four/ 我之前的评论链接到的页面列出了四个 用于控制返回值的当前语法选项。 (--&gt; 是最通用的——它支持指定类型约束(例如--&gt; Int),就像其他三种形式一样,但它也支持指定常量值 i>(例如--&gt; 42)。
  • @raiph 哦,没错,谢谢。我非常不喜欢有多种语法,以至于我在阅读文档后立即忘记了其中的两个。现在让我试着再次忘记其他两个......
猜你喜欢
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 2015-10-12
相关资源
最近更新 更多