クワイン (プログラミング)
Haskellでの例。Haskellには値をその表現に変換するshow関数が備わっているため簡単に実装できる。
あるプログラマがこれをナイーブに実装しようとしているとする。まず、ソースコードの中に直接自分自身のコードを文字列にして埋め込もうとするだろう。そしてしばらくして、ある種の「無限後退」に陥ってしまっていることに気付くことになる。自然言語の例で表現するなら、「私は、「私は、「私は、......と言おうとした」と言おうとした」と言おうとした」というような感じになるが、この『......』の部分が無限になってしまうのである。これをどのように回避するかがポイントである。
一般に、任意のプログラミング言語でクワインを書くには、プログラム内を以下の2つの部分に分ける。第一は、出力を実際に行うソースコード、第二は、コードを文字列として表したデータである(例えば、後述のC言語の例での progdata)。コードはデータを使ってコード部自身の出力もするが(データの内容が元々コード部をテキスト表現にしたものであるため、これが可能となる)、もっと単純にデータのテキスト表現も出力する。コードとデータをプログラム内で構成する方法は様々であるが、データ部の共通な特徴として、データはプログラム全体のある程度の部分を反映している。