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?
Ich denke, es wäre, weil die betrügen REPL ruft implizit 'print()' für Sie auf; Ihr Quellcode druckt nicht selbst. – MrFlick
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
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