2015-11-03 11 views
11

Nachdem ich im Internet gestöbert habe, konnte ich niemanden finden, der eine Quine in R geschrieben hat (Edit: seit ich dies geschrieben habe, habe mehrere auf SO gefunden, bin aber immer noch an diesem interessiert). Also dachte ich, ich würde versuchen, selbst eine zu finden. Mein Ergebnis war der (überraschend kurz) Code:Ist Funktion() {} eine wahre Quine?

function(){} 

die folgende Ausgabe function(){} bei der Ausführung. Dies nutzt die Tatsache aus, dass ein Funktionsname ohne Parens oder Argumente den Quellcode der Funktion zurückgibt.

Ein Programm, das sich selbst betrachtet, wird jedoch im Allgemeinen nicht als echtes Quine angesehen. Es gibt zwei Dinge, die mir klar geworden sind, die ich nicht verstehe, wenn ich versuche zu entscheiden, ob ich eine "echte" Quine geschrieben habe: (1) Was macht ein Programm "sich selbst zu betrachten" (von einem Standpunkt aus gesehen) jenseits von Datei-E/A und (2) das Ausmaß, in dem function(){} (oder ähnliche Befehle wie logical(0)) selbstbezogen sind, wenn sie selbst drucken. Ersteres scheint für SO zu subjektiv zu sein, aber ich hatte auf eine Klärung des letzteren gehofft. So ...

Wenn ich function(){} ausführen, was genau passiert, verursacht es seinen eigenen "Quellcode" zu drucken? Beispiel: R lädt eine leere Funktion in eine lokale Umgebung, wertet diese Funktion aus und schaut sich dann den Code an, der sie zum Drucken definiert hat? Oder schaut es einfach function(){} an und gibt sofort seine Definition wieder? Gibt es einen grundlegenden Unterschied zwischen dieser und

in Bezug darauf, wie sie sich beide im laufenden Betrieb drucken?

+5

Ich denke, es wäre, weil die betrügen REPL ruft implizit 'print()' für Sie auf; Ihr Quellcode druckt nicht selbst. – MrFlick

+1

Ich habe noch nie das Wort 'quine' gehört, aber R-Funktionen machen Spaß, vielleicht so etwas wie 'f <- (function() this <- function() print (attr (this, 'scrref')))()' then 'f()' – jenesaisquoi

+1

Jede anonyme Funktionsdefinition ist eine Quine, die Ihrer Logik folgt. Tatsächlich wird die Funktion, die Sie definieren, nicht ausgeführt, sondern nur gedruckt, wie @MrFlick sagte. – nicola

Antwort

0

Dies ist kein echtes Quine, da nichts auf stdout gedruckt wird. Der Hauptpunkt von Quine ist, dass es sich durch Drucken reproduzieren kann. Das Programm muss eine neue Datei oder Ausgabe in stdout erstellen, die den genauen Code enthält.

Beispiel einer Javascript quine wäre:

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

Sie nicht vollständig erhalten, was hier vor sich geht. Eigentlich ist der Code

function(){} 

tut nichts, außer eine Funktion ohne Argumente und Körper konstruieren, es zurückkehrt und es sofort zu löschen, nachdem sie zurückgegeben. Seine Ausgabe würde NULL sein, also nicht "sich selbst neu erstellen".

Die Ausgabe, die Sie in der Konsole sehen, ist nicht die Ausgabe von function(){}, sondern von print.function. Dies ist die S3-Methode, die darauf achtet, ein Funktionsobjekt in der Konsole anzuzeigen. Was Sie wirklich tun, ist:

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

Eine wahre R quine wäre so etwas wie dieses:

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

Siehe auch Wikipedia für dieses und andere Beispiele