2017-07-05 72 views
3

一個Perl 6 Regex是一個更具體的Method類型,所以我有這樣的想法,也許我可以做一些黑魔法在一個常規的方法,產生同樣的事情。我特別好奇在不改變任何語法的情況下這樣做。我可以更改方法中的Perl 6俚語嗎?

然而,看着Perl6/Grammar.nqp(我幾乎不明白),這實際上不是一個繼承的東西。我認爲,根據我的閱讀,Perl 6語法在看到一個正則表達式聲明符時會切換俚語(子語言)。也就是說,不同的語法解析regex { ... }method {...}的內容。

所以,首先,是嗎?

然後,只是爲了笑聲,我想也許我可以在方法塊內但告訴它使用不同的俚語(例如,請參閱"Slangs" from the 2013 Perl 6 Advent Calendar"Slangs Today")。

但是,我發現的一切看起來都像是想改變語法。有沒有辦法做到這一點,並返回一個字符串,被視爲如果它出來regex { ... }

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

我對此沒有任何實際用途。我只是一直在想。

+0

「返回一個字符串,它被視爲正則表達式{...}?」作爲編譯正則表達式的結果,編譯器生成正則表達式*對象*,而不是字符串。這是你的意思嗎?你的意思是說有一種方法可以替代正則表達式嗎? – raiph

+0

「所以,首先,正確的(那)不同的語法解析正則表達式{...}和方法{...}(?)的內涵」是的,「主要」P6俚語/語法分析正則表達式'方法'聲明,但使用'Regex'俚語/語法來解析'regex'聲明的主體。 – raiph

+1

「也許我可能在一個方法塊內,但告訴它使用不同的俚語」你可以,但使用俚語意味着改變編譯器正在使用的語法,你寫道你不想改變語法。 – raiph

回答

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」 
+0

我不想匹配一個正則表達式,我想創建一個正則表達式。我知道我的問題需要做一些工作,因爲這是一個不可思議的想法,我們必須談論的所有語言都會將它推向不同的解釋。 –

+0

moritz的答案涵蓋了「我如何創建正則表達式」。然而你的評論說「我想創建一個正則表達式」。也許你讀了他的答案的舊副本,錯過了那一點?如果是這樣,它是否充分回答你的問題?如果不是,我們缺少什麼? – raiph

+0

您可以通過'rx //'quote運算符創建正則表達式。 – moritz

相關問題