首页 文章

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

提问于
浏览
3

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

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

那么,首先,是吗?

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

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

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

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

1 回答

  • 2

    首先,Perl 6设计文档要求一个API,其中regex返回一个可能匹配的惰性列表 . 如果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.* 的等价物 . 我希望这回答了你的问题 .

    更新:我可能误解了这个问题 . 如果问题是"How can I create a regex object"(而不是"how can I write code that acts like a regex",据我所知),答案是你必须通过 rx// 引用结构:

    my $str = 'ab.*';
    my $re = rx/ <$str> /;
    
    say 'fooabc' ~~ $re;       # Output: 「abc」
    

相关问题