業務で使えない技術です。
コードと解説
local quine = "local quine = %q; print(quine:format(quine))"; print(quine:format(quine))
実行すると、実行したのと同じコードが出力されます。
quine:format(quine)
このコードのミソです。
string.format(quine, quine)
と同じで、文字列 quine
の変換指示句を quine
に置き換えます。有限長のコードで「出力のコードを実行する」という操作が無限回行えるからくりです。
%q
指示句
Lua ソースコード上に展開しても正しく読まれるようにエスケープして置き換える指示句です。例えば、"hogehoge"
で置換させようとすると \"hogehoge\"
で置換されます。これは print すれば "hogehoge"
になります。
反対に、%s
を置換すると "hogehoge"
は hogehoge
として置換しますので、print するとダブルクォートが抜けてしまいます。
構造
変数 s
の宣言部を A
、出力部を B
として、以下のような構造になっています。
A"A%qB"B
出力時、%q
が"
を含むダブルクォートの中身に置き換えられますので全く同じ構造が現れることがわかります。
おわりに
ChatGPT 3.5 に「Quine 作って!」とお願いしたら出てきたコードです。
https://github.com/MakeNowJust/quine/blob/main/quine.lua
ここが学習元かな。。。と思っています。