13

インターネットをいじった後、Rでクワインを書いた人を見つけることができませんでした(編集:これを書いて以来、SOでいくつか見つけましたが、まだこれに興味があります)。だから、自分で考えてみようと思いました。私の結果は(驚くほど短い)コードでした:

function(){}

実行時に出力さfunction(){}れます。これは、関数名の後に括弧や引数がない場合、関数のソース コードが返されるという事実を利用しています。

ただし、「自分自身を見る」プログラムは、一般に真のクワインとは見なされません。私が「本物の」クワインを書いたかどうかを判断しようとする過程で、私が理解できないことに気付いたことが 2 つあります。ファイル i/o と (2) function(){}(または のような同様のコマンドlogical(0)) が自分自身を印刷するときの自己参照の程度。前者は SO には主観的すぎるようですが、後者については説明を期待していました。そう...

を実行するfunction(){}と、独自の「ソースコード」を出力する原因は正確には何ですか? たとえば、R は空の関数をローカル環境にロードし、その関数を評価してから、それを定義したコードを調べて出力しますか? それとも、すぐにfunction(){}その定義を見てエコーするだけですか? これとの間に根本的な違いはありますか

f<-function(){cat("f<-");print(f);cat("f()")}
f()

実行時に両方がどのように印刷されるかという点で?

4

2 に答える 2

1

ここで何が起こっているのか完全にはわかりません。実はコードは

function(){}

引数と本体なしで関数を構築し、それを返し、返された直後に削除すること以外は何もしません。その出力は になるNULLため、「それ自体を再作成」しません。

コンソールに表示される出力は、によって与えられた出力ではなく、function(){}によって与えられたものprint.functionです。これは、関数オブジェクトをコンソールに表示する S3 メソッドです。実際に行うことは次のとおりです。

a <- function(){}
print(a)
rm(a)

真の R クワインは次のようになります。

m<-"m<-0;cat(sub(0,deparse(m),m))";cat(sub(0,deparse(m),m))

この例やその他の例については、ウィキペディアも参照してください

于 2017-07-12T12:47:12.273 に答える