From: Thomas Walker Lynch Date: Mon, 12 May 2025 14:02:46 +0000 (-0700) Subject: some experiments X-Git-Url: https://git.reasoningtechnology.com/usr/lib/python2.7/encodings/idna.py?a=commitdiff_plain;h=dfbbcfe09e6c0ecd9f0cb43407db84e04d29a184;p=RT-gcc some experiments --- diff --git "a/experiments\360\237\226\211/assign_directive.c" "b/experiments\360\237\226\211/assign_directive.c" new file mode 100644 index 0000000..00d2b32 --- /dev/null +++ "b/experiments\360\237\226\211/assign_directive.c" @@ -0,0 +1,15 @@ +#include + +#define NAME first_assign +#define the 42 + +#assign (NAME)(the body) +#assign [NAME][the +body +the +] + +int main(void){ + printf("all good"); + return 0; +} diff --git "a/experiments\360\237\226\211/macro_directive.c" "b/experiments\360\237\226\211/macro_directive.c" new file mode 100644 index 0000000..70e6157 --- /dev/null +++ "b/experiments\360\237\226\211/macro_directive.c" @@ -0,0 +1,49 @@ +#include +//#macro X 42 + + #define x 5 + +/* + #macro Y(x) ((x * 51)) + #macro Z () (3) +*/ + +// #macro Q(f ,...) ( printf(f ,__VA_ARGS__) ) + +// #macro Q(f ,...) ( printf(f ,__VA_ARGS__) +// ) + +#macro Q(f ,...)( + printf(f ,__VA_ARGS__) +) + +#if 0 + // The parameter list does not get expanded when scanned, as expected, so this fails. + // When the parameter is set to 'Y' instead of 'y' this works. + #define Z 7 + #define y Y + #macro P(y)(Y+Z) +#endif + +#if 0 +// The body is not expanded when a macro is defined. However, to get mutliline +// behavior we turned off the directive parsing mode, so this will be interesting +// ... +// Y was not expanded in the definition, so this failed at the expansion point +// of the printf below. +#define Y 5 +#macro R(Z)(Y+Z) +#undef Y +#endif + +int main(void){ + // printf("Y: %d\n", Y(3)); + // printf("Z: %d\n", Z()); + Q("%x %x %x" ,1 ,2 ,3); + putchar('\n'); + + // printf("P: %d\n", P(3)); + // printf("R: %d\n", R(11)); + + return 0; +} diff --git "a/experiments\360\237\226\211/recursive_define_0.c" "b/experiments\360\237\226\211/recursive_define_0.c" new file mode 100644 index 0000000..da2919a --- /dev/null +++ "b/experiments\360\237\226\211/recursive_define_0.c" @@ -0,0 +1,52 @@ +#include + + +#define X Q()B()(C) +#define Q() A +#define A(x) 21 +#define B() + +int main(){ + printf("X %d" ,X); +} + +/* + +So cpp truly does walk the token list with `cpp_get_token_1(pfile, &loc);` expanding each token one by one left to right. We should be able to get the desired expansion by adding another layer of macros, so that the argument expansion catches the final A(c). + +2025-05-12T02:53:59Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> gcc test_recursive_define_0.c +test_recursive_define_0.c: In function ‘main’: +test_recursive_define_0.c:5:13: warning: implicit declaration of function ‘A’ [-Wimplicit-function-declaration] + 5 | #define Q() A + | ^ +test_recursive_define_0.c:4:12: note: in expansion of macro ‘Q’ + 4 | #define X Q()B()(C) + | ^ +test_recursive_define_0.c:10:18: note: in expansion of macro ‘X’ + 10 | printf("X %d" ,X); + | ^ +test_recursive_define_0.c:4:19: error: ‘C’ undeclared (first use in this function) + 4 | #define X Q()B()(C) + | ^ +test_recursive_define_0.c:10:18: note: in expansion of macro ‘X’ + 10 | printf("X %d" ,X); + | ^ +test_recursive_define_0.c:4:19: note: each undeclared identifier is reported only once for each function it appears in + 4 | #define X Q()B()(C) + | ^ +test_recursive_define_0.c:10:18: note: in expansion of macro ‘X’ + 10 | printf("X %d" ,X); + | ^ + +2025-05-12T02:54:17Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> gcc -E -P test_recursive_define_0.c | tail -n 5 +extern int __overflow (FILE *, int); + +int main(){ + printf("X %d" ,A(C)); +} + +*? diff --git "a/experiments\360\237\226\211/recursive_define_1.c" "b/experiments\360\237\226\211/recursive_define_1.c" new file mode 100644 index 0000000..a7c6335 --- /dev/null +++ "b/experiments\360\237\226\211/recursive_define_1.c" @@ -0,0 +1,44 @@ +#include + + +#define X Q()B()(C) +#define Q() A +#define A(x) 21 +#define B() + +#define P(x) x + +int main(){ + printf("X %d" ,P(X)); +} + +/* +2025-05-12T03:00:19Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> /bin/gcc test_recursive_define_1.c + +2025-05-12T03:00:51Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> ./a.out +X 21 +2025-05-12T03:00:55Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> gcc test_recursive_define_1.c + +2025-05-12T03:01:03Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> ./a.out +X 21 +2025-05-12T03:01:05Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> gcc -E -P test_recursive_define_1.c | tail -n 5 +extern int __overflow (FILE *, int); + +int main(){ + printf("X %d" ,21); +} + +2025-05-12T03:01:11Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> +*/ diff --git "a/experiments\360\237\226\211/recursive_define_2.c" "b/experiments\360\237\226\211/recursive_define_2.c" new file mode 100644 index 0000000..ecd87cc --- /dev/null +++ "b/experiments\360\237\226\211/recursive_define_2.c" @@ -0,0 +1,58 @@ +#include + + +#define X Q()B()(C) +#define Q() A +#define A(x) 21 +#define B() + +#define P X + +int main(){ + printf("X %d" ,P); +} + +/* + This does not work because it does not cause an argument evaluation, as did test_recursive_define_1.c + +2025-05-12T03:01:11Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> gcc test_recursive_define_2.c +test_recursive_define_2.c: In function ‘main’: +test_recursive_define_2.c:5:13: warning: implicit declaration of function ‘A’ [-Wimplicit-function-declaration] + 5 | #define Q() A + | ^ +test_recursive_define_2.c:4:12: note: in expansion of macro ‘Q’ + 4 | #define X Q()B()(C) + | ^ +test_recursive_define_2.c:9:11: note: in expansion of macro ‘X’ + 9 | #define P X + | ^ +test_recursive_define_2.c:12:18: note: in expansion of macro ‘P’ + 12 | printf("X %d" ,P); + | ^ +test_recursive_define_2.c:4:19: error: ‘C’ undeclared (first use in this function) + 4 | #define X Q()B()(C) + | ^ +test_recursive_define_2.c:9:11: note: in expansion of macro ‘X’ + 9 | #define P X + | ^ +test_recursive_define_2.c:12:18: note: in expansion of macro ‘P’ + 12 | printf("X %d" ,P); + | ^ +test_recursive_define_2.c:4:19: note: each undeclared identifier is reported only once for each function it appears in + 4 | #define X Q()B()(C) + | ^ +test_recursive_define_2.c:9:11: note: in expansion of macro ‘X’ + 9 | #define P X + | ^ +test_recursive_define_2.c:12:18: note: in expansion of macro ‘P’ + 12 | printf("X %d" ,P); + | ^ + +2025-05-12T03:02:36Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> +*/ + +