Geniale, rekursive Code-Generierung

Athaba

Libellenliebhaber
Hallo,

vielleicht hätte ich es ja nach Fun posten sollen, aber es ist sehr lehrreich. Ein Ruby-Code, welcher Python-Code generiert, welcher Perl-Code generiert, welcher Lua-Code generiert, welcher OCaml-Code generiert, welcher Haskell-Code generiert, welcher C-Code generiert, welcher Java-Code generiert, welcher Brainfuck-Code generiert, welcher Whitespace-Code generiert, welcher Unlambda-Code generiert und schlussendlich wieder den original Ruby-Code generiert.

Code:
# ruby
l=92.chr;eval s="s=s.dump[r=1..-2].gsub(/("+l*4+"){4,}(?!\")/){|t|'\"+l*%d+\"'%(t
.size/2)};5.times{s=s.dump[r]};puts\"# python\\nprint(\\\"# perl\\\\nprint(\\\\\\
\"# lua"+l*4+"nprint("+l*7+"\"(* ocaml *)"+l*8+"nprint_endline"+l*15+"\"-- haskel
l"+l*16+"nimport Data.List;import Data.Bits;import Data.Char;main=putStrLn("+l*31
+"\"/* C */"+l*32+"n#include<stdio.h>"+l*32+"nint main(void){char*s[501]={"+l*31+
"\"++intercalate"+l*31+"\","+l*31+"\"(c(tail(init(show("+l*31+"\"/* Java */"+l*32
+"npublic class QuineRelay{public static void main(String[]a){String[]s={"+l*31+"
\"++intercalate"+l*31+"\","+l*31+"\"(c("+l*31+"\"brainfuck"+l*64+"n++++++++[>++++
<-]+++++++++>>++++++++++"+l*31+"\"++(concat(snd(mapAccumL h 2("+l*31+"\"110"+l*31
+"\"++g(length s)++"+l*31+"\"22111211100111112021111102011112120012"+l*31+"\"++co
ncatMap("+l*32+"c->let d=ord c in if d<11then"+l*31+"\"21002"+l*31+"\"else"+l*31+
"\"111"+l*31+"\"++g d++"+l*31+"\"22102"+l*31+"\")s++"+l*31+"\"2100211101012021122
2211211101000120211021120221102111000110120211202"+l*31+"\"))))))++"+l*31+"\","+l
*63+"\""+l*64+"n"+l*63+"\"};int i=0;for(;i<94;i++)System.out.print(s[i]);}}"+l*31
+"\")))))++"+l*31+"\",0};int i=0;for(;s[i];i++)printf("+l*63+"\"%s"+l*63+"\",s[i]
);puts("+l*63+"\""+l*63+"\");return 0;}"+l*31+"\");c s=map("+l*32+"s->"+l*31+"\""
+l*63+"\""+l*31+"\"++s++"+l*31+"\""+l*63+"\""+l*31+"\")(unfoldr t s);t[]=Nothing;
t s=Just(splitAt(if length s>w&&s!!w=='"+l*31+"\"'then 501else w)s);w=500;f 0=Not
hing;f x=Just((if x`mod`2>0then '0'else '1'),x`div`2);g x= reverse (unfoldr f x);
h p c=let d=ord c-48in(d,replicate(abs(p-d))(if d<p then '<'else '>')++"+l*31+"\"
."+l*31+"\");s="+l*31+"\"# ruby"+l*32+"n"+l*31+"\"++"+l*31+"\"l=92.chr;eval s=\"+
(z=l*31)+\"\\\"\"+s+z+\"\\\""+l*31+"\"++"+l*31+"\""+l*32+"n"+l*31+"\""+l*15+"\""+
l*7+"\")"+l*4+"n\\\\\\\")\\\")\"########### (c) Yusuke Endoh, 2009 ###########\n"

http://asiajin.com/blog/2009/09/22/uroboros-programming-with-11-programming-languages/

Gruß,
Athaba
 
Gott, das ist so krank!

Hast du das mal ausprobiert? Ich habe nicht alle nötigen Interpreter auf dem Rechner ich beherrsche nur 3 der genannten Sprachen.
 
Ich habe zwar nicht die Tiefenkenntnisse der Programmierung, aber es reicht daß auch mir das Ganze sehr ... eigen vorkommt ... ;)
 
Ich habe die von ernst verlinkte Version getestet. War zwar eine Orgie die Interpreter/Compiler zum Laufen zu bekommen, aber ansonsten funktioniert es hier wunderbar.

EDIT: (spoiler ;)) Die Source Codes sehen so aus.
 
Zuletzt bearbeitet:
omfg
Irgendwie genial und sehr interessant, aber unter einem nicht so nerdigen Blickwinkel schon sehr krank. :D
 
Was war eigentlich zuerst da, Brainfuck oder Whitespace? Und welche Sprache ist das größere Verbrechen?
 
Gute Frage Brainfuck ist noch als Notation für Turingmaschinen entschuldbar. Whitespace muss sich ja nicht angucken ;-)
 
Verbrechen sind sie nicht, nur sinnlos und praktisch unbrauchbar.
*hust* OOP(PDF), Java, ...

Aber mal im Ernst, durch solche Spielereien kann man sehr viel lernen und regen zum Nachdenken an. Es gibt dann ja noch richtige Zwangsjacken. Außerdem lässt sich über Sinnhaftigkeit von so ziemlich allem hervorragend streiten.

Brainfuck ist ja auch interessant, weil es eigentlich sehr simpel ist. Während Brainfuck ein Scherz ist trifft das auf P´´ ja nicht unbedingt zu. Dabei handelt es sich um eine Sprache, die ziemlich große Ähnlichkeit aufweist, aber historisch durchaus bedeutsam ist, weil es die erste turing-vollständige Sprache ohne GOTO war.
 
Scherz in dem Sinne, dass es nicht darum ging ein Problem zu lösen, sondern in diese Fall "lediglich" darum einen möglichst kleinen Compiler zu schreiben. Brainfuck ist im Gegensatz zu P´´ eben eine esoterische Sprache. Ich mag den Ausdruck aber nicht wirklich.

Aber zurück zum Thema. Schon jemand den Code durchforstet?
 
Zuletzt bearbeitet:
Zurück
Oben