function(){}是真正的quine吗?

时间:2015-11-03 21:50:07

标签: r quine

在互联网上闲逛后,我无法找到任何在R中写过quine的人(编辑:自写这篇文章以来,已经找到了几个关于SO,但我仍然对此感兴趣)。所以我想我会试着亲自拿出一个。我的结果是(令人惊讶的简短)代码:

function(){}

运行时将输出function(){}。这利用了这样一个事实,即没有parens或参数的函数名称将返回函数的源代码。

然而,一个"看着自己的节目"通常不被认为是真正的quine。在我试图决定是否写了一个真实的"时,我意识到我无法理解的两件事情。 quine:(1)什么构成了一个程序"看着自己" (从一个角度来看)超出文件i / o的使用范围和(2)function(){}(或类似logical(0)之类的命令)在打印时自我引用的程度。前者似乎对SO来说过于主观,但我希望对后者进行一些澄清。所以......

当我运行function(){}时,究竟发生了什么导致它打印出自己的"源代码"?例如,R是否将空函数加载到本地环境中,评估该函数,然后回顾定义它以进行打印的代码?或者,它只是看着function(){}并立即回应其定义?这与

之间是否存在根本区别?
f<-function(){cat("f<-");print(f);cat("f()")}
f()

在运行时如何打印自己?

2 个答案:

答案 0 :(得分:1)

你没有完全理解这里发生的事情。实际上,代码

function(){}

除了构造一个没有参数和body的函数之外什么都不做,返回它并在它返回后立即删除它。它的输出为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))

有关此示例和其他示例,请参阅Wikipedia

答案 1 :(得分:0)

这不是一个真正的因素,因为它不会向stdout打印任何东西。奎因的全部意义在于它可以通过印刷来重现自身。程序必须在stdout中创建一个包含其确切代码的新文件或输出。

javascript quine的例子是:

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