是否有人在R中构建了一个quine(“一个程序,它将自己的源文本副本生成为完整输出”:http://www.nyx.net/~gthompso/quine.htm)? ([quine]标签在Python,Java中提取了很多例子......但在R中显然没有。)
f <- function() { body() }
接近:
> f()
{
body()
}
但缺少函数的名称。
最短的可能性怎么样?大多数混淆了?
编辑:从下面的各种答案中,似乎有多种方法可以定义自我指涉性和必须发生的环境:
->
函数(@ bill_080)->
程序[或多或少等同于程序->
文本]:(@ khhkeke)->
文字(@JoshUlrich,@ James,上面定义的问题)注意:
identical(quine,quine())
是一个很好的测试用例,虽然它很棘手,因为环境可以随身携带:identical(quine,quine(),ignore.environment=TRUE)
可能更容易。< / LI>
答案 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的回答原理相同,只是简单地回顾了基本要素。