We can put this into practice:
q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']" "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'" "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"
This is a Haskell program that outputs a Python program that outputs a Ruby program that outputs the original Haskell program.
Apologies for the lack of line breaks. If it's not readable, it should be possible to copy and paste that source. Also, you may need to tweak it if your OS doesn't treat character 10 as a new line.
That is awesome.
ReplyDelete[15:27 /]$ ghci
ReplyDelete___ ___ _
/ _ \ /\ /\/ __(_)
/ /_\// /_/ / / | | GHC Interactive, version 6.6.1, for Haskell 98.
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
\____/\/ /_/\____/|_| Type :? for help.
Prelude> q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
< interactive >:1:7: parse error on input `='
Impressive O_O
ReplyDeletenice!
ReplyDeleteNikolay: you won't be able to just paste it into ghci like that, you'll have to put it in a file and then load the file into ghci.
nikolay:
ReplyDeleteWrite it into .hs file and use runhaskell to execute it.
ghci expects let before name bindings to distinguish them from expressions.
Ooh, I see. Thanks! It is really awesome!
ReplyDeleteWow! That is really awesome.
ReplyDeleteWow! You're all dorks
ReplyDeleteAmazing :)
ReplyDelete...please where can I buy a unicorn?
ReplyDeleteGorgeous!
ReplyDeleteThis is so fascinating! You are awesome =]
ReplyDeleteWhat this really needs is a recursive function
ReplyDeleteit formatted my pr0n.
ReplyDeleterunhaskell 3quine |python|ruby|diff 3quine -
ReplyDelete*blinks*
*awe*