Skip to content

Instantly share code, notes, and snippets.

@0e4ef622
Last active September 17, 2023 17:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 0e4ef622/b36aac42f1f234611f6d927fc26f60f6 to your computer and use it in GitHub Desktop.
Save 0e4ef622/b36aac42f1f234611f6d927fc26f60f6 to your computer and use it in GitHub Desktop.
Rust macro quine. The macro that defines itself.
#![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