完成自製腳本編譯器與虛擬機後,針對腳本層面的 OO 支援,我設計了一套以 table 為核心的輕量級機制,靈感源自 Lua 但做了關鍵改進,讓成員存取與方法呼叫更直觀。
table,同時作陣列與雜湊表使用。table,裡面存放方法函數。a[0])指向類別表(虛函數表 vtbl)。-> 呼叫語法糖:a->sum() 編譯期轉為 a[0]->sum(a),自動傳入 self。. 開頭:.a 在方法內自動展開為 _self.a。_ 開頭(如 _self),編譯器以此識別 self 參數。_ 開頭變數強制為區域變數,其餘為全域,簡化編譯並防筆誤。A = {};
function A.sum(_self) {
return .a + .b; // 自動展開 _self.a + _self.b
}
function A.print(_self) {
print(->sum()); // 展開 _self->sum()
return _self;
}
a = {A, .a=100, .b=200}; // a[0]=A (vtbl), .a/.b 為實例成員
a->print(); // 呼鏈:a->print() → A.print(a) → print(A.sum(a)) → 300
./-> 前綴隱式綁定,比 Lua 的 function t:f() 更徹底。A.static_func() 直接呼叫,不傳 self。GET_MEMBER/CALL_METHOD 對應 ./->。_ 變數屬性,語義分析階段驗證 self 參數命名規範。