From: senda@... Date: 1998-02-19T13:17:21+09:00 Subject: [ruby-list:6523] Re: Self-Reproduction (Re: call for scripts) From: Shin-ichiro HARA 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