2015-11-03 18 views
11

インターネット上を撫でた後、私はRでquineを書いた人を見つけることができませんでした(編集:これを書いて以来、SOのいくつかを見つけましたが、まだこれに興味があります)。だから私は自分で自分の手を試してみようと思った。function(){}は本当ですか?

出力 function(){}が実行されます
function(){} 

:私の結果は(意外に短い)コードでした。これは、関数のソースコードを返した後に、括弧や引数がない関数名が使用されるという事実を利用しています。

しかし、「自分自身を見る」というプログラムは、一般的に本当のクインとはみなされません。私が "本当の"キンを書いたかどうかを判断しようとする過程で理解していないことが分かったのは、(1)キンという立場から見て、ファイルI/Oと、(2)function(){}(またはlogical(0)のような同様のコマンド)が、自分自身を印刷するときに自己参照する程度。前者はあまりにも主観的すぎるようですが、私は後者を明確にすることを望んでいました。だから...

私はfunction(){}を実行すると、正確に何が起きて、それが自分自身の "ソースコード"を印刷するのでしょうか?たとえば、空の関数をローカル環境にロードし、その関数を評価した後、それを定義したコードを調べて印刷しますか?または、それはちょうどfunction(){}を見て、すぐにその定義をエコーし​​ていますか?これと基本的な違いはありますか?

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

実行時に両者がどのように印刷されるかという点では違いはありますか?

+5

にもWikipedia私はので、それは浮気すると思いますREPLは暗黙のうちに 'print()'を呼び出しています。ソースコード自体が印刷されていません。 – MrFlick

+1

「quine」という言葉は一度も聞こえませんでしたが、Rの関数は楽しいですね、 'f < - function()this < - function()print(attr(this、 'srcref')))()' 'f()' – jenesaisquoi

+1

任意の無名関数の定義は、あなたのロジックに従います。実際には、定義している関数は実行されず、ただ印刷されます。@ MurFlickによると。 – nicola

答えて

0

stdoutに何も印刷しないので、これは真実ではありません。 Quineの全ポイントは、それが印刷によって再現できるということです。プログラムは、正確なコードを含むstdoutに新しいファイルまたは出力を作成する必要があります。 JavaScriptのQUINEの

例は次のようになります。

(function a(){console.log(`(${a}())`)}()) 
1

あなたは完全にここで何が起こっているのか得ることはありません。実際には、コード

function(){} 

は、それが返された直後に、引数とボディなしで機能を構築し、それを返すと、それを削除別に何もしません。その出力はNULLになるので、 "自身を再作成"しません。

コンソールに表示される出力は、function(){}の出力ではなく、print.functionの出力ではありません。これは、コンソールに関数オブジェクトを表示するS3メソッドです。あなたが実際に行う、何をしている:

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

真のR QUINEがこのようなものになるだろう:

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

参照してください。この例および他の例

関連する問題