From: Shin-ichiro HARA <sinara / blade.nagaokaut.ac.jp>
Subject: [ruby-list:6511] Self-Reproduction (Re: call for scripts)
Date: Wed, 18 Feb 1998 21:59:32 +0900
Message-ID: <199802181259.VAA16390 / blade.nagaokaut.ac.jp>

sinara> 原です。
sinara> 
sinara> 千田さんのメールの Reply-to が、ruby-list / netlab.co.jp ではなくて、
sinara> 千田さん自身になっているので、さっき千田さん直接メールを送ってしま
sinara> ったようです。(^^;

千田です。申し訳ありません。

sinara> 
sinara> 私もこんなのを書いてみました。
sinara> 
sinara> -----^ self-fold.rb
sinara> #!/usr/local/bin/ruby
sinara> gets; gets; lines = $<.read
sinara> printf("#!/usr/local/bin/ruby
sinara> lines = \"%s\"; %s", lines.gsub(/[\\"]/){"\\"+$&}, lines)
sinara> -----$ self-fold.rb
sinara> 
sinara> これは実は「自分自身を取り込んで自己複製プログラムを作るプログラム」
sinara> です。つまり、
sinara> 
sinara> ./self-fold.rb self-fold.rb > self-repr.rb
sinara> 
sinara> とすると self-repr.rb が「自己複製プログラム」なんです。

へえー。
なるほど。
自己言及しているところを読み込むようにしてやればこんなことができるんですね。


sinara> 
sinara> # "#!/usr/local/bin/ruby" が2ヶ所あるところがイマイチ。
sinara> 

ええと、

(6) trace_varをつかってプリント部分を前に持ってきたもの。sub()がいらない。
-----------
#!/usr/local/bin/ruby
trace_var:$a,proc{print$a,$a,"E\n"};$a=<<'E'
#!/usr/local/bin/ruby
trace_var:$a,proc{print$a,$a,"E\n"};$a=<<'E'
E
-----------
というのをつくってみました。

さらに、自分をよみこんでこれを生成するプログラムをつくってみました。

(6')
-----------
#!/usr/local/bin/ruby
trace_var:$a,proc{print$a,$a,"E\n"};$a=<<"E"
#{gets}#{gets.chop.sub('"E"',"'E'")}
E
-----------

これなら1つは減らすことができます。:-)


						S.Senda