2011-02-27 26 views
10

我在嘗試使用Devel::Declare創建關鍵字時遇到問題。在這件事上沒有太多的例子和教程。使用Devel創建新的Perl關鍵字::聲明

我的寵物項目是創建一個名爲doing具有類似Ruby的do語法,比如這個新的關鍵詞:

my @arr = qw/foo bar baz/; 
@arr doing $x { 
    print "x is $x"; 
}; 

我的想法是與Devel::Declare解析鉤把它變成一個for my $x (@arr) { ... }聲明。我不確定這是否可能。

我發現的大多數示例(從Devel::Declare測試目錄)都用於創建method式樣的關鍵字。

我將不勝感激一些關於如何入門的指南,或關鍵功能,以使用能夠處理,或現有的代碼來基於我。

回答

14
  1. Devel :: Declare不會讓你收回已經解析過的東西。如果您將doing轉換爲關鍵字,那麼@arr doing ...仍然需要轉換成啓動@arr,這似乎是一個相當大的障礙。
  2. 由於Devel :: Declare的方式實現了它的魔力,它的使用方式有限 - 它只允許你聲明看起來像subs的名字的「關鍵字」,在Perl將爲尋找的地方子的名稱。它不會讓你把任意的操作員放在你喜歡的地方。事實上,在情況最扭曲的作品,你必須keywordsomestuff{ ... }它可以變成一個簡單的調用keyword(一些其他的東西和可能轉化sub { ... })。你可以看到爲什麼它能很好地適用於methodTest::Class::Sugar。我的意思是,在數組的名字後立即是而不是 perl分析器正在尋找子的名稱的地方;這是一個解析器正在尋找一個操作符的地方,所以@arr doing ...會在Devel :: Declare有任何介入之前給你一個bareword found where operator expected錯誤。

這兩項的大概可以繞改變的事情讓你的關鍵字出現就行第一來克服,但現在你有keywordsomestuff{ ... }其中數組名是somestuff和你堅定地認爲大多數其他模塊已經分解出來的模式 - 只有當你產生一個for循環時,你纔可能將這個模塊作爲一個真正的模塊,而不是將它作爲一個子模塊來解析而不是定義。

+2

這就解釋了爲什麼一切都如此「方法」導向。謝謝。順便說一句,我剛剛發現我可以做一些非常類似於普通的Perl:'@arr ~~ sub {my $ x = shift;打印「x是$ x」}'。也許我會試着將它與Devel :: Declare結合起來。 – ojosilva