<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mundo Geek &#187; perl</title>
	<atom:link href="http://mundogeek.net/etiqueta/perl/feed/" rel="self" type="application/rss+xml" />
	<link>http://mundogeek.net</link>
	<description>Mundo geek, bitácora sobre todo lo geek: software, gadgets, tecnología, internet, ...</description>
	<lastBuildDate>Fri, 25 May 2012 14:51:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Un programa escrito en Haskell, que imprime un programa en Perl, que imprime&#8230;</title>
		<link>http://mundogeek.net/archivos/2011/03/15/un-programa-escrito-en-haskell-que-imprime-un-programa-en-perl-que-imprime/</link>
		<comments>http://mundogeek.net/archivos/2011/03/15/un-programa-escrito-en-haskell-que-imprime-un-programa-en-perl-que-imprime/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 16:37:51 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[curiosidades]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[quine]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=6522</guid>
		<description><![CDATA[¿Un programa escrito en Haskell, que al ejecutarse imprime un programa en Perl, que al ejecutarse imprime un programa en Python, que al ejecutarse imprime un programa en Ruby, que al ejecutarse imprime un programa en C, que al ejecutarse imprime un programa en Java, que al ejecutarse imprime el programa original? Sí, es como [...]]]></description>
			<content:encoded><![CDATA[<p>¿Un <a href="http://blog.sigfpe.com/2011/01/quine-central.html" title="Quine central">programa</a> escrito en Haskell, que al ejecutarse imprime un programa en Perl, que al ejecutarse imprime un programa en Python, que al ejecutarse imprime un programa en Ruby, que al ejecutarse imprime un programa en C, que al ejecutarse imprime un programa en Java, que al ejecutarse imprime el programa original? Sí, es como para que te duela la cabeza, aunque el código, que podéis ver después del salto, es de lo más sencillo.</p>
<p>Este tipo de programas que se imprimen a sí mismos como salida (aunque en este caso, con una peculiaridad extra) se conocen con el nombre de <em>quines</em>, en honor al filósofo estadounidense Willard Van Orman Quine.<span id="more-6522"></span></p>
<pre name="code" class="haskell">import Data.List

langs = [Haskell, Perl, Python, Ruby, C, Java]

data Languages = Haskell | Ruby | Perl | C | Python | Java

sequenceFromString Haskell s = "map toEnum[" ++ (intercalate "," $
    map (\c -> show (fromEnum c)) s) ++ "]"
sequenceFromString Perl s    = (intercalate "," $
    map (\c -> "chr(" ++ show (fromEnum c) ++ ")") s)
sequenceFromString Python s  = (intercalate "+" $
    map (\c -> "chr(" ++ show (fromEnum c) ++ ")") s)
sequenceFromString Ruby s    = (intercalate "+" $
    map (\c -> show (fromEnum c) ++ ".chr") s)
sequenceFromString C s       = concatMap
    (\c -> "putchar(" ++ show (fromEnum c) ++ ");") s
sequenceFromString Java s    = concatMap
    (\c -> "o.write(" ++ show (fromEnum c) ++ ");") s

paramList' Haskell = intercalate " " . map (\n -> "a" ++ show n)
paramList' C       = intercalate "," . map (\n -> "char *a" ++ show n)
paramList' Python  = intercalate "," . map (\n -> "a" ++ show n)
paramList' Ruby    = intercalate "," . map (\n -> "a" ++ show n)
paramList' Java    = intercalate "," . map (\n -> "String a" ++ show n)

paramList Perl    _ = ""
paramList lang n = paramList' lang [0..n-1]

driver l args = defn l ++ intercalate (divider l) args ++ endDefn l

divider C       = "\",\""
divider Perl    = "','"
divider Ruby    = "\",\""
divider Python  = "\",\""
divider Haskell = "\" \""
divider Java    = "\",\""

defn C       = "main(){q(\""
defn Perl    = "&#038;q('"
defn Python  = "q(\""
defn Ruby    = "q(\""
defn Haskell = "main=q \""
defn Java    = "public static void main(String[]args){q(\""

endDefn C       = "\");}"
endDefn Perl    = "')"
endDefn Python  = "\")"
endDefn Ruby    = "\")"
endDefn Haskell = "\""
endDefn Java    = "\");}}"

arg Haskell n = "a" ++ show n
arg Perl n    = "$_[" ++ show n ++ "]"
arg C n       = "printf(a" ++ show n ++ ");"
arg Python n  = "a" ++ show n
arg Ruby n    = "a" ++ show n
arg Java n    = "o.print(a" ++ show n ++ ");"

argDivide Haskell l = "++" ++ sequenceFromString Haskell (divider l) ++ "++"
argDivide Perl l    = ","    ++ sequenceFromString Perl (divider l) ++ ","
argDivide C l       = sequenceFromString C (divider l)
argDivide Python l  = "+" ++ sequenceFromString Python (divider l) ++ "+"
argDivide Ruby l    = "+" ++ sequenceFromString Ruby (divider l) ++ "+"
argDivide Java l    = sequenceFromString Java (divider l)

argList lang1 lang2 n = intercalate (argDivide lang1 lang2) $
    map (arg lang1) ([1..n-1] ++ [0])

fromTo Haskell l n = "q " ++ paramList Haskell n ++ "=putStrLn$a0++" ++
    sequenceFromString Haskell ("\n" ++ defn l) ++ "++" ++
    argList Haskell l n ++ "++" ++ sequenceFromString Haskell (endDefn l)
fromTo Perl    l n = "sub q {" ++ "print $_[0]," ++
    sequenceFromString Perl ("\n" ++ defn l) ++ "," ++ argList Perl l n ++ "," ++
    sequenceFromString Perl (endDefn l ++ "\n") ++ "}"
fromTo Python  l n = "def q(" ++ paramList Python n ++
    "): print a0+" ++ sequenceFromString Python ("\n" ++ defn l) ++
    "+" ++ argList Python l n ++ "+" ++ sequenceFromString Python (endDefn l)
fromTo Ruby    l n = "def q(" ++ paramList Ruby n ++
    ") print a0+" ++ sequenceFromString Ruby ("\n" ++ defn l) ++
    "+" ++ argList Ruby l n ++ "+" ++ sequenceFromString Ruby (endDefn l ++ "\n") ++ " end"
fromTo C       l n = "q(" ++ paramList C n ++ "){" ++ "printf(a0);" ++
    sequenceFromString C ("\n" ++ defn l) ++ argList C l n ++
    sequenceFromString C (endDefn l ++ "\n") ++ "}"
fromTo Java    l n = "public class quine{public static void q(" ++
    paramList Java n ++ "){java.io.PrintStream o=System.out;o.print(a0);" ++
    sequenceFromString Java ("\n" ++ defn l) ++ argList Java l n ++
    sequenceFromString Java (endDefn l ++ "\n") ++ "}"

main = do
    let n = length langs
    let langs' = cycle langs
    putStrLn $ fromTo (head langs') (head (tail langs')) n
    putStrLn $ driver (head langs') $ zipWith (\lang1 lang2 -> fromTo lang1 lang2 n)
        (take n (tail langs')) (tail (tail langs'))</pre>
<p><small><a href="http://news.ycombinator.com/item?id=2322145">Vía Hacker News</a></small></p>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link>
<script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><br />
<script language="javascript" src="http://mundogeek.net/sh/js/shBrushHaskell.js"></script><br />
<script language="javascript">dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh//flash/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');</script></p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2011/03/15/un-programa-escrito-en-haskell-que-imprime-un-programa-en-perl-que-imprime/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Perl y RSA</title>
		<link>http://mundogeek.net/archivos/2008/09/07/perl-y-rsa/</link>
		<comments>http://mundogeek.net/archivos/2008/09/07/perl-y-rsa/#comments</comments>
		<pubDate>Sun, 07 Sep 2008 17:31:00 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[citas]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=1693</guid>
		<description><![CDATA[&#8220;Perl &#8211; el único lenguaje de programación que tiene el mismo aspecto antes y después de un cifrado RSA.&#8221; &#8211; Keith Bostic]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8220;Perl &#8211; el único lenguaje de programación que tiene el mismo aspecto antes y después de un cifrado RSA.&#8221;</p>
<p>&#8211; Keith Bostic</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2008/09/07/perl-y-rsa/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Matrículas geek</title>
		<link>http://mundogeek.net/archivos/2008/04/10/matriculas-geek/</link>
		<comments>http://mundogeek.net/archivos/2008/04/10/matriculas-geek/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 10:07:15 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=1452</guid>
		<description><![CDATA[Algunas matrículas de coches muy geeks, vistas en The Geekiest License Plates]]></description>
			<content:encoded><![CDATA[<p>Algunas matrículas de coches muy geeks, vistas en <a href="http://www.geek24.com/g/the-best-geeky-license-plates" title="Matrículas geek">The Geekiest License Plates</a></p>
<p><img src="http://mundogeek.net/wp-content/linux-geek.jpg" alt="Matrícula Linux geek" title="Matrícula Linux geek"/><br />
<span id="more-1452"></span><br />
<img src="http://mundogeek.net/wp-content/root-777.jpg" alt="Matrícula root 777" title="Matrícula root 777"/></p>
<p><img src="http://mundogeek.net/wp-content/user-perl.jpg" alt="Matrícula use Perl" title="Matrícula use Perl"/></p>
<p><img src="http://mundogeek.net/wp-content/su-root.jpg" alt="Matrícula su root" title="Matrícula su root"/></p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2008/04/10/matriculas-geek/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Monos, perl, y Java</title>
		<link>http://mundogeek.net/archivos/2007/05/11/monos-perl-y-java/</link>
		<comments>http://mundogeek.net/archivos/2007/05/11/monos-perl-y-java/#comments</comments>
		<pubDate>Fri, 11 May 2007 13:14:15 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[citas]]></category>
		<category><![CDATA[humor]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2007/05/11/monos-perl-y-java/</guid>
		<description><![CDATA[&#8220;Si pones un millón de monos a escribir en un millón de teclados, eventualmente, uno de ellos escribirá un programa en Java. El resto de ellos escribirán programas en Perl.&#8221; &#8211; Anónimo]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8220;Si pones un millón de monos a escribir en un millón de teclados, eventualmente, uno de ellos escribirá un programa en Java. El resto de ellos escribirán programas en Perl.&#8221;</p></blockquote>
<p>&#8211; Anónimo</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2007/05/11/monos-perl-y-java/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Brainfuck vs. Perl</title>
		<link>http://mundogeek.net/archivos/2006/11/26/brainfuck-vs-perl/</link>
		<comments>http://mundogeek.net/archivos/2006/11/26/brainfuck-vs-perl/#comments</comments>
		<pubDate>Sun, 26 Nov 2006 12:31:19 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[brainfuck]]></category>
		<category><![CDATA[citas]]></category>
		<category><![CDATA[humor]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2006/11/26/brainfuck-vs-perl/</guid>
		<description><![CDATA[Urban Müller, cuando le preguntaron por qué había diseñado Brainfuck (jode cerebros): No sabía que existía Perl]]></description>
			<content:encoded><![CDATA[<p>Urban Müller, cuando le preguntaron por qué había diseñado <a href="http://es.wikipedia.org/wiki/Brainfuck" title="Brainfuck">Brainfuck</a> (jode cerebros):</p>
<blockquote><p>No sabía que existía Perl</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2006/11/26/brainfuck-vs-perl/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

