From: hal9000@... Date: 2000-07-19T20:55:34+00:00 Subject: [ruby-talk:04137] First quines in ruby? Greetings, all. This is a fairly frivolous post, so those of you in a big hurry can skip it. Maybe you are familiar with the practice of writing programs that reproduce themselves. (I always liked Plauger's comment -- I think it was Plauger -- who said, "This is often done in FORTRAN, for the same reason that three-legged races are popular.") The word "quine" comes from the mathematician Quine, by way of Hofstadter's book _Goedel, Escher, Bach_. My understanding is that any Turing-complete language is capable of reproducing itself -- i.e., all but the most trivial and useless languages. (I'm only repeating what I've heard -- I'm not that much of a theorist.) By the way, it is considered cheating to access a file (for example, cat $(whence $0) in Kornshell) or to use a built-in listing feature (like 10 LIST 10 in BASIC). Anyway, I was curious as to whether it had been done in Ruby yet. A search of the mailing list archive didn't turn up anything. So unless someone speaks up, I claim the first one in Ruby. Here are three different ones. The first is a ripoff of a famous quine in C, working only on ASCII machines. s="s=%c%s%c; printf s,34,s,34,10%c"; printf s,34,s,34,10 The next one uses a here-document type of string. a=<<'EOF' print "a=<<'EOF'" print a print "EOF\n" print a EOF print "a=<<'EOF'" print a print "EOF\n" print a The third one is a little more tricky and a little more fragile. $a=%w( def xx $a.each do |x| if x =~ /xx/ print x+"\n" else print x, " " end end end; print "$a=%w( "; xx print ")\n"; xx ) def xx $a.each do |x| if x =~ /xx/ print x+"\n" else print x, " " end end end; print "$a=%w( "; xx print ")\n"; xx That's all, folks. Have a great day! Hal Fulton Sent via Deja.com http://www.deja.com/ Before you buy.