優秀的 2011 年 Raku 發布元編程:什么、為什么和如何提供了一些清晰的例子,EXPORTHOW用于創建一個像class. 這是第一個:
my class SingleInheritanceClassHOW
is Metamodel::ClassHOW
{
method add_parent(Mu $obj, Mu $parent) {
if self.parents($obj, :local) > 0 {
die "Multiple inheritance is forbidden!";
}
callsame;
}
}
my module EXPORTHOW { }
EXPORTHOW.WHO.<class> = SingleInheritanceClassHOW;
有沒有辦法為宣告sub符做類似的事情(也就是說,允許使用提供簽名和塊,而不是允許用戶提供屬性和方法)?a 的元類Sub是ClassHOW,所以看起來類似的事情應該是可能的,但我沒有看到這樣做的方法。
uj5u.com熱心網友回復:
該EXPORTHOW機制僅用于覆寫將用于包宣告符的元類,帶有輕微的擴展,EXPORTHOW::DECLARE還執行引入新包宣告符的語法調整。
雖然可以呼叫.HOWa Sub,但結果與子例程本身無關,而是與Sub型別的元類相關,子例程是其中的一個實體。
真的,這EXPORTHOW是一種“簡單的事情容易”的機制(在某種程度上,將與元編程相關的任何事情都稱為簡單的事情是公平的!)這也是一件簡單的事情:包宣告的決議已經非常規則,并且編譯器已經維護了一個從包關鍵字到元類的映射表,因此為模塊提供一種方法來替換該表中的條目(或添加新條目DECLARE)只是編譯器黑客的幾個小時。
例程要少得多,即使這只是在語法上有些明顯。雖然包幾乎決議關鍵字(class,role,grammar等),接下來是非常相同的語法和語意為所有這些(模角色允許的簽名),有單獨決議的規則和語意各背后sub,method,macro,和rule. 它們與整個編譯程序的互動也更加復雜。正在進行的 RakuAST 努力正在為這種混亂帶來更多秩序,最終 - 當與俚語結合時 - 將提供一種引入新sub的類似結構的方法,并賦予它們語意。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/384544.html
