- Introduce $vaarg[...] syntax and deprecate the old $vaarg(...).

- Similar change to `$vasplat`: `$vasplat` and `$vasplat[1..]`.
This commit is contained in:
Christoffer Lerno
2024-08-16 09:28:28 +02:00
parent 9fd9280132
commit edfea639cf
20 changed files with 119 additions and 74 deletions

View File

@@ -6,10 +6,10 @@ import std::io;
macro print_type_info(...)
{
$for (var $i = 0; $i < $vacount; $i++)
io::printfn("type: %s", $vatype($i).nameof);
io::printfn("%s.sizeof = %d", $vatype($i).nameof, $vatype($i).sizeof);
io::printfn("%s.min = %s", $vatype($i).nameof, $vatype($i).min);
io::printfn("%s.max = %s\n", $vatype($i).nameof, $vatype($i).max);
io::printfn("type: %s", $vatype[$i].nameof);
io::printfn("%s.sizeof = %d", $vatype[$i].nameof, $vatype[$i].sizeof);
io::printfn("%s.min = %s", $vatype[$i].nameof, $vatype[$i].min);
io::printfn("%s.max = %s\n", $vatype[$i].nameof, $vatype[$i].max);
$endfor;
}

View File

@@ -1,20 +1,20 @@
macro foo(...)
{
$vaarg("hello"); // #error: Expected the argument index here
$vaarg["hello"]; // #error: Expected the argument index here
int x;
$vaarg(x); // #error: Vararg functions need a constant argument
$vaarg(-1); // #error: negative
$vaarg(100); // #error: varargs exist
$vaarg[x]; // #error: Vararg functions need a constant argument
$vaarg[-1]; // #error: negative
$vaarg[100]; // #error: varargs exist
}
macro foo2(...)
{
$vaconst(0);
$vaconst[0];
}
macro foo3(...)
{
$vatype(0) a;
$vatype[0] a;
}
fn void main()
{

View File

@@ -6,10 +6,10 @@ import std::io;
macro @foo(...)
{
int i = $vaarg(1) + $vaarg(1);
int j = $vaexpr(2) + $vaexpr(2);
int i = $vaarg[1] + $vaarg[1];
int j = $vaexpr[2] + $vaexpr[2];
$for (var $i = 0; $i < $vacount; $i++)
io::printfn("%d", $vaarg($i));
io::printfn("%d", $vaarg[$i]);
$endfor;
}
@@ -17,9 +17,9 @@ macro foo2(...)
{
$for (var $i = 0; $i < $vacount; $i++)
{
$vatype($i) x;
$vatype[$i] x;
}
io::printfn("%s", $vatype($i).nameof);
io::printfn("%s", $vatype[$i].nameof);
$endfor;
}
@@ -34,9 +34,9 @@ macro foo3(...)
macro @foo4(...)
{
$typeof(*$varef(0)) a = *$varef(0);
*$varef(0) = *$varef(1);
*$varef(1) = a;
$typeof(*$varef[0]) a = *$varef[0];
*$varef[0] = *$varef[1];
*$varef[1] = a;
}
fn int ping(int val)
{

View File

@@ -4,47 +4,47 @@ import std::io;
macro @hello(...)
{
int[*] a = { 1, $vasplat(), 3 };
int[*] a = { 1, $vasplat, 3 };
foreach (i, x : a) io::printfn("%d: %d", i, x);
}
macro @hello1(...)
{
int[*] a = { 1, $vasplat() };
int[*] a = { 1, $vasplat };
foreach (i, x : a) io::printfn("x:%d: %d", i, x);
}
macro @hello2(...)
{
int[*] a = { $vasplat(), 888 };
int[*] a = { $vasplat, 888 };
foreach (i, x : a) io::printfn("x:%d: %d", i, x);
}
macro @hello3(...)
{
int[*] a = { $vasplat() };
int[*] a = { $vasplat };
foreach (i, x : a) io::printfn("x:%d: %d", i, x);
}
macro @hello4(...)
{
int[*] a = { 5, $vasplat(2..4), 77 };
int[*] a = { 5, $vasplat[2..4], 77 };
foreach (i, x : a) io::printfn("y:%d: %d", i, x);
}
macro @hello5(...)
{
int[*] a = { 5, $vasplat(2..), 77 };
int[*] a = { 5, $vasplat[2..], 77 };
foreach (i, x : a) io::printfn("y:%d: %d", i, x);
int[*] b = { 55, $vasplat(2..^2), 88 };
int[*] b = { 55, $vasplat[2..^2], 88 };
foreach (i, x : b) io::printfn("z:%d: %d", i, x);
int[*] c = { 55, $vasplat(0:^2), 88 };
int[*] c = { 55, $vasplat[0:^2], 88 };
foreach (i, x : c) io::printfn("zz:%d: %d", i, x);
}
macro @hello6(...)
{
@hello(66, $vasplat());
@hello(66, $vasplat);
}
fn void main()
{

View File

@@ -5,7 +5,7 @@ import std::io;
macro test(start, ...)
{
$for (var $i = 0; $i < $vacount; $i++)
for ($vatype($i) i = ($vatype($i))start; i < 5; i+=2)
for ($vatype[$i] i = ($vatype[$i])start; i < 5; i+=2)
{
assert(math::is_even(i));
assert(i.is_even());