// Session 87 — `$t:type` fragment for sizeof / cast type positions import Std::Io::{PrintLine, PrintInt}; import Std::Array::{Array, Array_New, Array_Push, Array_Get, Array_Len, Array_Reverse, Array_Free}; import Std::Test::{ Test_AssertEqInt, Test_AssertEqString, Test_AssertNeqString, Test_Pass }; import Std::String::{String_ToUpper}; macro! size_of { ( $t:type ) => { sizeof($t) as int } } macro! cast_zero { ( $t:type ) => { 0 as $t } } func Main() -> int { let a: int = size_of!(int); let b: int = size_of!(*int); PrintInt(a); PrintLine(""); PrintInt(b); PrintLine(""); // 4 or 8 depending on ABI if a != 4 && a != 8 { PrintLine("FAIL size_of int"); return 1; } if b != 4 && b != 8 { PrintLine("FAIL size_of *int"); return 1; } let z: int = cast_zero!(int); Test_AssertEqInt(z, 0); // Array_Reverse + Test_AssertNeqString var arr: Array = Array_New(4); Array_Push(&arr, 1); Array_Push(&arr, 2); Array_Push(&arr, 3); Array_Reverse(&arr); Test_AssertEqInt(Array_Get(&arr, 0), 3); Test_AssertEqInt(Array_Get(&arr, 1), 2); Test_AssertEqInt(Array_Get(&arr, 2), 1); Test_AssertEqInt(Array_Len(&arr) as int, 3); Array_Free(&arr); Test_AssertEqString(String_ToUpper("ok"), "OK"); Test_AssertNeqString("a", "b"); PrintLine("PASS macro_type"); Test_Pass("macro_type"); return 0; }