2

OK、この用語に出会ったことがない人にとって、クワインは「自己複製」コンピュータプログラムです。具体的には、実行時に、唯一の出力として独自のソースコードのコピーを生成するものです。

もちろん、クインは多くのプログラミング言語で開発できます(すべてではありません)。しかし、一部の言語は明らかに他の言語よりもクワインの生産に適しています(やや主観的な響きの「より適した」を明確に理解するには、WikiページのHaskellの例とCの例を見てください-そして私は以下に私のより客観的な定義を提供します) 。

私が持っている質問は、プログラミング言語の観点から、どの言語機能(理論設計のものまたは構文糖衣構文のいずれか)が言語をクワインを書くのにより適した/役立つものにするかどうかです。

私の「より適切な」の定義は、「クワインは書きやすい」と「より短い/より読みやすい/難読化されていない」です。ただし、少なくともある程度客観的な基準を追加することは大歓迎です。

この質問は、「print_a_quine」プリミティブを含むように設計された言語のように、縮退したケースを明示的に除外していることに注意してください。

4

3 に答える 3

3

Ioプログラミング言語などの言語では、コードをデータとして扱うことができます。ツリーウォーキングシステムでは、これにより通常、言語実装者は抽象構文木を第一級市民として公開できます。Ioの場合、これが実行されます。オブジェクト指向であるため、ASTはメッセージオブジェクトを中心にモデル化され、現在実行中のメッセージを表すために特別な番兵が作成されます。この歩哨はと呼ばれthisMessageます。thisMessage他のメッセージと同様に完全なメッセージであり、printメッセージに応答して画面に出力します。その結果、私がこれまでにどの言語でも生産できた中で最も短いクワインは、イオから来て、次のようになります。

thisMessage print

とにかく、私はこのテーマについてあなたとこれを共有せずにはいられませんでした。上記は確かにクワインを書くのを簡単にしますが、このようにしないことは確かにクワインを簡単に作成することを妨げるものではありません。

于 2010-06-19T23:00:38.147 に答える
3

完全にはわかりませんので、ご存知の方がいらっしゃいましたら訂正してください。私は他の両方の答えに同意し、さらに説明すると、クワインはこれです:

Y g

ここで、YはY固定小数点コンビネータ(またはその他の固定小数点コンビネータ)です。これは、ラムダ計算で次のことを意味します。

Y g = g(Y g)

ここで、コードがデータであり、gが引数を出力する関数である必要があることは明らかです。

したがって、要約すると、このようなクワイン関数、印刷関数、固定小数点コンビネータ、および名前による呼び出しの評価戦略を構築する必要があります。

この条件を満たす最小の言語は、IotaandJotファミリーのAFAIKZotです

于 2010-06-20T00:32:18.940 に答える
2

これが実用的な観点から有用な答えであるかどうかはわかりませんが、計算可能性理論にはいくつかの有用な理論があります。特に、不動点とクリーネの再帰定理は、クワインを書くために使用できます。どうやら、理論はLISPでクワインを書くために使用することができます(ウィキペディアのページが示すように)。

于 2010-06-19T23:01:35.743 に答える