构造quines(自我复制功能)

时间:2011-06-27 16:30:01

标签: r quine

是否有人在R中构建了一个quine(“一个程序,它将自己的源文本副本生成为完整输出”:http://www.nyx.net/~gthompso/quine.htm)? ([quine]标签在Python,Java中提取了很多例子......但在R中显然没有。)

f <- function() { body() }

接近:

> f()
{
    body()
}

但缺少函数的名称。

最短的可能性怎么样?大多数混淆了?

编辑:从下面的各种答案中,似乎有多种方法可以定义自我指涉性和必须发生的环境:

    R环境中的
  • :函数->函数(@ bill_080)
  • OS / shell环境中的
  • :程序->程序[或多或少等同于程序->文本]:(@ khhkeke)
  • 其他:函数->文字(@JoshUlrich,@ James,上面定义的问题)

注意:

  • thread from R-help pointed out by @Spacedman(这似乎强调了简洁的混淆)表明identical(quine,quine())是一个很好的测试用例,虽然它很棘手,因为环境可以随身携带:identical(quine,quine(),ignore.environment=TRUE)可能更容易。< / LI>
  • 最近(2015年10月)blog post提供了另一个答案......

5 个答案:

答案 0 :(得分:22)

这是我能想到的最短时间:

> "f" <- function() call("<-", "f", f)
> f()
"f" <- function () 
call("<-", "f", f)

答案 1 :(得分:21)

这是一个真正的Quine,一个程序(不是一个函数),它生成一个自己的源文本副本作为其完整输出。

在控制台上,

# y1.R is a quine program
$ cat y1.R
(function(x){cat(x);cat('(');cat(intToUtf8(0x0022));cat(x);cat(intToUtf8(0x0022));cat(')')})("(function(x){cat(x);cat('(');cat(intToUtf8(0x0022));cat(x);cat(intToUtf8(0x0022));cat(')')})")

# execute y1.R and show output
$ /usr/bin/R --vanilla --slave < y1.R
(function(x){cat(x);cat('(');cat(intToUtf8(0x0022));cat(x);cat(intToUtf8(0x0022));cat(')')})("(function(x){cat(x);cat('(');cat(intToUtf8(0x0022));cat(x);cat(intToUtf8(0x0022));cat(')')})")

# save the output of the execution of y1
$ /usr/bin/R --vanilla --slave < y1.R > y2.R

# compare input and output -- exactly same.
$ diff y1.R y2.R

可能这不是最短的。

<强>更新:

稍短的版本:

(function(x){cat(x,'(',d<-intToUtf8(0x0022),x,d,')',sep='')})("(function(x){cat(x,'(',d<-intToUtf8(0x0022),x,d,')',sep='')})")

答案 2 :(得分:6)

使用body作为灵感的内容,call可用于重现调用命令:

f <- function () 
{
    call("<-", as.name(as.character(sys.calls()[[1]])), sys.function(sys.parent()))
}

哪个输出:

> f()
f <- function () 
{
    call("<-", as.name(as.character(sys.calls()[[1]])), sys.function(sys.parent()))
}

答案 3 :(得分:1)

如果你想要一个返回函数的函数.....也许这个?

junk <- function(...) {
  function(...) {
    structure(junk(...))
  }
}

输出结果为:

> junk()

function(...) {
    structure(junk(...))
  }
<environment: 01ef8e50>


> boo <- junk(999)
> boo

function(...) {
    structure(junk(...))
  }
<environment: 020e1048>


>dput(boo)

function (...) 
{
    structure(junk(...))
}

答案 4 :(得分:1)

虽然我不确定这&#34;是否计算&#34;从quine的角度来看(我在试图验证它是否存在时偶然发现了这个问题),脚本

function(){}

将输出function(){}。这与Joshua Ulrich的回答原理相同,只是简单地回顾了基本要素。