【问题标题】:Is function(){} a true quine?function(){} 是真正的 quine 吗?
【发布时间】:2015-11-03 21:50:07
【问题描述】:

在互联网上四处寻找之后,我找不到任何用 R 写过 quine 的人(编辑:自从写这篇文章以来,在 SO 上找到了几个,但我仍然对这个感兴趣)。所以我想我会试着自己想出一个。我的结果是(令人惊讶的短)代码:

function(){}

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

但是,“查看自身”的程序通常不被视为真正的 quine。在试图决定我是否写了一个“真正的”quine 的过程中,我意识到有两件事我不明白:(1)什么构成了一个程序“看着自己”(从 quine 的角度来看)超出了使用文件 i/o 和 (2) function(){}(或类似的命令,如 logical(0))在打印自身时的自引用程度。前者似乎对 SO 来说过于主观,但我希望对后者有所澄清。所以...

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

之间有根本区别吗?
f<-function(){cat("f<-");print(f);cat("f()")}
f()

就它们在运行时如何打印自己而言?

【问题讨论】:

  • 我认为这是作弊,因为 REPL 隐含地为您调用 print();您的源代码不会自行打印。
  • 我从未听说过“quine”这个词,但 R 函数很有趣,可能是 f &lt;- (function() this &lt;- function() print(attr(this,'srcref')))() 然后 f()
  • 任何匿名函数定义都是遵循你的逻辑的。实际上,正如@MrFlick 所说,您定义的函数并未执行,而只是打印出来。
  • 或者f &lt;- function() print(attr(get('f'), 'srcref')) 会更有意义
  • 这很有趣,但我不确定它是否正题:这不是一个编程问题,而是一个关于 quine 的定义的问题,很容易固执己见答案...更多讨论here

标签: r quine


【解决方案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))

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

【讨论】:

    【解决方案2】:

    这不是真正的 quine,因为它不会将任何内容打印到标准输出。 Quine 的重点在于它可以通过印刷来复制自己。程序必须在标准输出中创建一个包含其确切代码的新文件或输出。

    javascript quine 的示例是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 2019-03-16
      • 2011-03-23
      相关资源
      最近更新 更多