Quineをやってみる
RubyKaigi2024で見たやつ
実行結果が実行コードと一致する
ゴール:とりあえずQuineの仕組みを知って作れる
できれば:アニメーションを作れる
そもそもどういうものなのか調査
コードを読むとevalを使用しているものが多い。RubyGoldに出てきたやつだ。
👀
混乱しそう
文字列 expr を Ruby プログラムとして評価してその結果を返します。第2引数に Binding オブジェクトを与えた場合、そのオブジェクトを生成したコンテキストで文字列を評価します。
IntegerやStringもそもそもquineか。なんかずるいけど。
code: ruby
eval word = "word = puts 'hello'"
これだと
code:ruby
hello
こうなってしまう
puts helloが実行されるけど、戻り値のnilがwordに入ってそれが出てる(出てないけど)っぽい。
code: ruby
eval word = "puts' eval word = hello.inspect'"
# eval word = hello.inspect
近づいた。
"puts' eval word = hello.inspect'"がevalに渡されて実行される
だから、eval word = hello.inspectが出てくる
ここでquineにするには、再帰っぽくputsがもう一回出力されないといけないのか。
ということは、
code:ruby
eval word = "puts 'eval word ='+word.inspect"
# eval word ="puts 'eval word ='+word.inspect"
実行結果は同じだが過程を理解できた
改行させるのがむずい
%wリテラルは空白を無視し、単語リストを生成する