Last active
September 17, 2023 17:37
-
-
Save 0e4ef622/b36aac42f1f234611f6d927fc26f60f6 to your computer and use it in GitHub Desktop.
Rust macro quine. The macro that defines itself.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#![recursion_limit = "1505"] | |
macro_rules! A { | |
($name:tt) => { A!(($) (*) $name); }; | |
(($d:tt) ($s:tt) $name:tt) => { | |
A!(1 $d $s $name [] [] [ | |
(1 dd d:tt dd s:tt dd name:tt [dd (dd hh:tt)ss] [dd (dd h:tt)ss] [e dd dd (dd t:tt)ss] dd (dd _:tt)ss) => { | |
nn!(1 dd d dd s dd name [dd (dd hh)ss e dd] [dd (dd h)ss dd d] [dd (dd t)ss] dd (dd _)ss); | |
}; | |
(1 dd d:tt dd s:tt dd name:tt [dd (dd hh:tt)ss] [dd (dd h:tt)ss] [e ss dd (dd t:tt)ss] dd (dd _:tt)ss) => { | |
nn!(1 dd d dd s dd name [dd (dd hh)ss e ss] [dd (dd h)ss dd s] [dd (dd t)ss] dd (dd _)ss); | |
}; | |
(1 dd d:tt dd s:tt dd name:tt [dd (dd hh:tt)ss] [dd (dd h:tt)ss] [e nn dd (dd t:tt)ss] dd (dd _:tt)ss) => { | |
nn!(1 dd d dd s dd name [dd (dd hh)ss e nn] [dd (dd h)ss dd name] [dd (dd t)ss] dd (dd _)ss); | |
}; | |
(1 dd d:tt dd s:tt dd name:tt [dd (dd hh:tt)ss] [dd (dd h:tt)ss] [e e dd (dd t:tt)ss] dd (dd _:tt)ss) => { | |
nn!(e e dd d dd s dd name [dd (dd hh)ss e e] [dd (dd h)ss] [dd (dd t)ss] dd (dd _)ss); | |
}; | |
(e e dd d:tt dd s:tt dd name:tt [dd (dd hh:tt)ss] [dd (dd h:tt)ss] [dd c:tt dd (dd t:tt)ss] dd (dd _:tt)ss) => { | |
nn!(1 dd d dd s dd name [dd (dd hh)ss dd c] [dd (dd h)ss dd c] [dd (dd t)ss] dd (dd _)ss); | |
}; | |
(1 dd d:tt dd s:tt dd name:tt [dd (dd hh:tt)ss] [dd (dd h:tt)ss] [(dd (dd c:tt)ss) dd (dd t:tt)ss] dd (dd _:tt)ss) => { | |
nn!(1 dd d dd s dd name [] [] [dd (dd c)ss] () [dd (dd hh)ss] [dd (dd h)ss] [dd (dd t)ss] dd (dd _)ss); | |
}; | |
(1 dd d:tt dd s:tt dd name:tt [dd (dd x:tt)ss] [dd (dd y:tt)ss] [] () [dd (dd a:tt)ss] [dd (dd b:tt)ss] dd (dd _:tt)ss) => { | |
nn!(1 dd d dd s dd name [dd (dd a)ss (dd (dd x)ss)] [dd (dd b)ss (dd (dd y)ss)] dd (dd _)ss); | |
}; | |
(1 dd d:tt dd s:tt dd name:tt [dd (dd hh:tt)ss] [dd (dd h:tt)ss] [{dd (dd c:tt)ss} dd (dd t:tt)ss] dd (dd _:tt)ss) => { | |
nn!(1 dd d dd s dd name [] [] [dd (dd c)ss] {} [dd (dd hh)ss] [dd (dd h)ss] [dd (dd t)ss] dd (dd _)ss); | |
}; | |
(1 dd d:tt dd s:tt dd name:tt [dd (dd x:tt)ss] [dd (dd y:tt)ss] [] {} [dd (dd a:tt)ss] [dd (dd b:tt)ss] dd (dd _:tt)ss) => { | |
nn!(1 dd d dd s dd name [dd (dd a)ss {dd (dd x)ss}] [dd (dd b)ss {dd (dd y)ss}] dd (dd _)ss); | |
}; | |
(1 dd d:tt dd s:tt dd name:tt [dd (dd hh:tt)ss] [dd (dd h:tt)ss] [[dd (dd c:tt)ss] dd (dd t:tt)ss] dd (dd _:tt)ss) => { | |
nn!(1 dd d dd s dd name [] [] [dd (dd c)ss] ([]) [dd (dd hh)ss] [dd (dd h)ss] [dd (dd t)ss] dd (dd _)ss); | |
}; | |
(1 dd d:tt dd s:tt dd name:tt [dd (dd x:tt)ss] [dd (dd y:tt)ss] [] ([]) [dd (dd a:tt)ss] [dd (dd b:tt)ss] dd (dd _:tt)ss) => { | |
nn!(1 dd d dd s dd name [dd (dd a)ss [dd (dd x)ss]] [dd (dd b)ss [dd (dd y)ss]] dd (dd _)ss); | |
}; | |
(1 dd d:tt dd s:tt dd name:tt [dd (dd hh:tt)ss] [dd (dd h:tt)ss] [dd c:tt dd (dd t:tt)ss] dd (dd _:tt)ss) => { | |
nn!(1 dd d dd s dd name [dd (dd hh)ss dd c] [dd (dd h)ss dd c] [dd (dd t)ss] dd (dd _)ss); | |
}; | |
(1 dd d:tt dd s:tt dd name:tt [dd (dd body1:tt)ss] [dd (dd body2:tt)ss] []) => { | |
macro_rules! dd name { | |
(dd d name:tt) => { dd name!((dd ) (ss) dd d name); }; | |
((dd d d:tt) (dd d s:tt) dd d name:tt) => { | |
dd name!(1 dd d d dd d s dd d name [] [] [dd (dd body1)ss]); | |
}; | |
dd (dd body2)ss | |
} | |
}; | |
]); | |
}; | |
(1 $d:tt $s:tt $name:tt [$($hh:tt)*] [$($h:tt)*] [dd $($t:tt)*] $($_:tt)*) => { // dd -> $ | |
A!(1 $d $s $name [$($hh)* dd] [$($h)* $d] [$($t)*] $($_)*); | |
}; | |
(1 $d:tt $s:tt $name:tt [$($hh:tt)*] [$($h:tt)*] [ss $($t:tt)*] $($_:tt)*) => { // ss -> * | |
A!(1 $d $s $name [$($hh)* ss] [$($h)* $s] [$($t)*] $($_)*); | |
}; | |
(1 $d:tt $s:tt $name:tt [$($hh:tt)*] [$($h:tt)*] [nn $($t:tt)*] $($_:tt)*) => { // nn -> $name | |
A!(1 $d $s $name [$($hh)* nn] [$($h)* $name] [$($t)*] $($_)*); | |
}; | |
(1 $d:tt $s:tt $name:tt [$($hh:tt)*] [$($h:tt)*] [e $($t:tt)*] $($_:tt)*) => { // escape (e x -> x) | |
A!(e $d $s $name [$($hh)* e] [$($h)*] [$($t)*] $($_)*); | |
}; | |
(e $d:tt $s:tt $name:tt [$($hh:tt)*] [$($h:tt)*] [$c:tt $($t:tt)*] $($_:tt)*) => { // escape part 2 | |
A!(1 $d $s $name [$($hh)* $c] [$($h)* $c] [$($t)*] $($_)*); | |
}; | |
(1 $d:tt $s:tt $name:tt [$($hh:tt)*] [$($h:tt)*] [($($c:tt)*) $($t:tt)*] $($_:tt)*) => { // () recursion | |
A!(1 $d $s $name [] [] [$($c)*] () [$($hh)*] [$($h)*] [$($t)*] $($_)*); | |
}; | |
(1 $d:tt $s:tt $name:tt [$($x:tt)*] [$($y:tt)*] [] () [$($a:tt)*] [$($b:tt)*] $($_:tt)*) => { // () return | |
A!(1 $d $s $name [$($a)* ($($x)*)] [$($b)* ($($y)*)] $($_)*); | |
}; | |
(1 $d:tt $s:tt $name:tt [$($hh:tt)*] [$($h:tt)*] [{$($c:tt)*} $($t:tt)*] $($_:tt)*) => { // {} recursion | |
A!(1 $d $s $name [] [] [$($c)*] {} [$($hh)*] [$($h)*] [$($t)*] $($_)*); | |
}; | |
(1 $d:tt $s:tt $name:tt [$($x:tt)*] [$($y:tt)*] [] {} [$($a:tt)*] [$($b:tt)*] $($_:tt)*) => { // {} return | |
A!(1 $d $s $name [$($a)* {$($x)*}] [$($b)* {$($y)*}] $($_)*); | |
}; | |
(1 $d:tt $s:tt $name:tt [$($hh:tt)*] [$($h:tt)*] [[$($c:tt)*] $($t:tt)*] $($_:tt)*) => { // [] recursion | |
A!(1 $d $s $name [] [] [$($c)*] ([]) [$($hh)*] [$($h)*] [$($t)*] $($_)*); | |
}; | |
(1 $d:tt $s:tt $name:tt [$($x:tt)*] [$($y:tt)*] [] ([]) [$($a:tt)*] [$($b:tt)*] $($_:tt)*) => { // [] return | |
A!(1 $d $s $name [$($a)* [$($x)*]] [$($b)* [$($y)*]] $($_)*); | |
}; | |
(1 $d:tt $s:tt $name:tt [$($hh:tt)*] [$($h:tt)*] [$c:tt $($t:tt)*] $($_:tt)*) => { // wildcard | |
A!(1 $d $s $name [$($hh)* $c] [$($h)* $c] [$($t)*] $($_)*); | |
}; | |
(1 $d:tt $s:tt $name:tt [$($body1:tt)*] [$($body2:tt)*] []) => { // build the macro | |
macro_rules! $name { | |
($d name:tt) => { $name!(($) (*) $d name); }; | |
(($d d:tt) ($d s:tt) $d name:tt) => { | |
$name!(1 $d d $d s $d name [] [] [$($body1)*]); | |
}; | |
$($body2)* | |
} | |
}; | |
} | |
A!(B); | |
B!(C); | |
C!(D); | |
D!(E); | |
E!(F); | |
F!(G); | |
// ad infinitum | |
fn main() { | |
println!("yay"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment