我可以在方法中更改Perl 6俚语吗?

时间:2017-07-05 23:57:51

标签: regex perl6

Perl 6 Regex是一种更具体的Method类型,所以我有一个想法,也许我可以用常规方法做一些产生同样事情的黑魔法。我特别好奇这样做而不改变任何语法。

然而,看Perl6/Grammar.nqp(我几乎不理解),这实际上不是继承的东西。我认为,根据我的阅读,Perl 6语法在看到一个正则表达式声明符时会切换俚语(子语言)。也就是说,不同的语法会解析regex { ... }method {...}的内容。

所以,首先,是吗?

然后,只是为了咯咯笑,我想也许我可以在方法块中但是告诉它使用不同的俚语(例如,参见"Slangs" from the 2013 Perl 6 Advent Calendar"Slangs Today")。

但是,我发现的一切看起来都想改变语法。有没有办法在没有它的情况下执行它并返回一个被视为regex { ... }出来的字符串?

method actually-returns-a-regex {
     ...
     }

我没有任何实际用途。我一直在想它。

1 个答案:

答案 0 :(得分:2)

首先,Perl 6设计文档要求一个API,其中正则表达式返回一个可能匹配的惰性列表。如果Rakudo坚持使用该API,您可以轻松编写一个充当正则表达式的方法,但解析会非常慢(因为惰性列表往往比作为回溯堆栈的字符串位置(整数)的紧凑列表更糟糕) )。

相反,Perl 6正则表达式返回匹配。你也可以这样做。下面是一个被称为语法中的正则表达式的方法示例:

grammar Foo {
    token TOP { a <rest> }

    method rest() {
        if self.target.substr(self.pos, 1) eq 'b' {
            return Match.new(
                orig   => self.orig,
                target => self.target,
                from => self.pos,
                to   => self.target.chars,
            );
        }
        else {
            return Match.new();
        }
    }
}

say Foo.parse('abc');
say Foo.parse('axc');

方法rest实现了正则表达式b.*的等价物。我希望这回答了你的问题。

更新:我可能误解了这个问题。如果问题是“如何创建正则表达式对象”(而不是“如何编写像正则表达式一样的代码”,正如我所理解的那样),答案是你必须通过rx//引用构造:

my $str = 'ab.*';
my $re = rx/ <$str> /;

say 'fooabc' ~~ $re;       # Output: 「abc」
相关问题