1

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

我最近读过关于 quines 的文章,有点坚持它的精确定义。例如,根据这个来源,一个quine“必须精确地打印出程序员作为程序一部分编写的那些指令”。

所以我的问题是:我可以将书面程序视为 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
4

1 回答 1

2

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

由最后一个编辑维基百科定义的人去,而不是严格意义上的 no 。这令人印象深刻,而且您非常接近,但顺序很重要,您确实需要输出底部的这两个调用。

通常,要测试您的程序是否为 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

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

tclsh my_quine.tcl > output
diff my_quine.tcl output
于 2019-09-24T15:18:57.347 回答