Vczh Library++ 3.0 的託管語言 ManagedX 設計為編譯至原生語言 NativeX(C++ 模板實現),因此必須提供最小版 mscorlib.dll,包含 String、陣列、委派/函式型別等無法由 ManagedX 自身實作的核心類別。
.mx (ManagedX) 檔案編譯為單一 .nx (NativeX) 檔案。a[,,,,,,,,,] 多維陣列,非交錯陣列)。為避免手寫 10 組近似類別,開發專用巨集語言 Fpmacro:
$$define $DIMENTION_FIELD_NAME($element) dimSize$element
$$define $DIMENTION_PARAMETER_NAME($element) _$element
$$define $DIMENTION_FIELD($element) $$begin
private int $DIMENTION_FIELD_NAME($element);
$$end
$$define $ARRAY_IMPLEMENTATION($elements) $$begin
generic<inout T>
public sealed class Array$elements : Array {
public constructor($loopsep($elements,0,$DIMENTION_PARAMETER_DEFINITION,$(,)), Array<T> src=null, bool copy=true) {
$loop($elements,0,$DIMENTION_FIELD_SETTER)
Initialize(this.Length, src, copy);
}
$loop($elements,0,$DIMENTION_FIELD)
public override int GetDimCount() { return $elements; }
public override int GetDimSize(int dim) {
switch(dim) {
$loop($elements,0,$DIMENTION_SIZE_CASE)
default: throw new ArgumentOutOfRangeException("dim");
}
}
public override int Length {
get { return $loopsep($elements,0,$DIMENTION_FIELD_NAME,$(*)); }
}
// ... GetStartIndexFromIndices, GetStartIndex 等
}
$$end
$loop(10, 1, $ARRAY_IMPLEMENTATION) // 產生 Array1 ~ Array10
| 巨集 | 用途 |
|---|---|
$loop(n, start, macro) | 迴圈展開,對 start..start+n-1 依次套用巨集 |
$loopsep(..., separator) | 迴圈展開並以分隔符連接(如參數列表用逗號) |
$sub(a,b) | 整數減法(巨集展開期計算) |
$$define ... $$begin ... $$end | 定義多行巨集模板 |
部分核心操作(如字串比較)無法在 ManagedX 純邏輯實現,標記為 external,由手寫 NativeX(C++ 模板)提供實作,編譯時連結。
語言自宿主的核心挑戰:核心類別必須先存在才能編譯編譯器。解法為「最小核心用目標語言手寫 → 其餘用自身語言實作 → 兩階段編譯」。Fpmacro 展示元程式設計在大量樣板程式碼產生上的威力。