那是奎因还是什么?

Is that quine or what?

我写了一个简单的装饰器,它打印传递给它的函数(例如 "foo"),然后我对它自己进行装饰。所以最后它打印了两个书面函数。

我最近阅读了有关 quines 的内容,但有点坚持它的精确定义。例如,根据this source阿奎因"must print out precisely those instructions which the programmer wrote as part of the program"。

所以我的问题是:我可以将编写的程序视为quine吗?

def decorate(function):
    from inspect import getsourcelines

    def wrapper(*args, **kwargs):
        for line_num, code_line in enumerate(getsourcelines(function)[0]):
            print(code_line)
    return wrapper


@decorate
def foo(bar1, bar2=777):
    print("bar")


foo(None)

decorate(decorate)(decorate)

精确输出为:

@decorate
def foo(bar1, bar2=777):
    print("bar")

def decorate(function):
    from inspect import getsourcelines

    def wrapper(*args, **kwargs):
        for line_num, code_line in enumerate(getsourcelines(function)[0]):
            code_line = code_line.replace('\n', '')
            print(code_line)
    return wrapper

quine 是一种计算机程序,它不接受输入并生成自己的源代码副本作为其唯一输出1

根据最后一位编辑维基百科定义的人的说法,绝对不是。令人印象深刻,你已经很接近了,但顺序很重要,你确实需要在输出底部进行这两个调用。

一般来说,测试你的程序是否是 quine:

./my_quine > output
diff my_quine output # should result in no differences

如果您不使用脚本语言,显然可能需要一些微尘步骤:

cc my_quine.c -o my_quine
./my_quine > output
diff my_quine.c output

 javac MyQuine.java
 java MyQuine > output
 diff MyQuine.java output

如果您直接通过解释器调用该文件,技术上您可以在输入和输出中省略脚本语言文件顶部的 shebang(即 #!/usr/bin/tclsh):

tclsh my_quine.tcl > output
diff my_quine.tcl output