更改

跳到导航 跳到搜索
添加138字节 、 2026年9月8日 (星期二)
第288行: 第288行:  
=== 直观图景:程序如何"谈论"自己的代码 ===
 
=== 直观图景:程序如何"谈论"自己的代码 ===
   −
'''例 1(Quine,Python 版)'''〔示例取自 Wikipedia "Quine (computing)";与 SRT 的关系见 Kiselyov, §2〕:所谓 '''quine''' 就是"打印出自己源代码的程序"。第二递归定理断言:这样的程序必然存在。下面这个 Python 程序就是教科书级的 quine——运行它,会原样打印出它自己的源码:
+
'''例 1(Quine,Python 版)'''〔示例取自 Wikipedia "Quine (computing)"<ref name="wikipedia_quine_computing" />;与 SRT 的关系见 Kiselyov<ref name="Kiselyov"/>, §2〕:所谓 '''quine''' 就是"打印出自己源代码的程序"。第二递归定理断言:这样的程序必然存在。下面这个 Python 程序就是教科书级的 quine——运行它,会原样打印出它自己的源码:
   −
```python
+
<syntaxhighlight lang="python3">
 
c = 'c = %r; print(c %% c)'; print(c % c)
 
c = 'c = %r; print(c %% c)'; print(c % c)
−
```
+
</syntaxhighlight>
    
它的机制很简洁:字符串 `c` 本身是一个"打印模板"——`%r` 会带上引号打印出 c 自己的内容,`%%` 是格式化转义符(输出为单个 `%`)。于是 `print(c % c)` 打印出的结果,恰好就是这个程序的全部源码。'''程序把自己的源码当作数据、再把它打印出来'''——这正是第二递归定理"程序合法地引用自己的代码"在程序语言里的最小实现。<ref name="wikipedia_quine_computing" /><ref name="kiselyov" />
 
它的机制很简洁:字符串 `c` 本身是一个"打印模板"——`%r` 会带上引号打印出 c 自己的内容,`%%` 是格式化转义符(输出为单个 `%`)。于是 `print(c % c)` 打印出的结果,恰好就是这个程序的全部源码。'''程序把自己的源码当作数据、再把它打印出来'''——这正是第二递归定理"程序合法地引用自己的代码"在程序语言里的最小实现。<ref name="wikipedia_quine_computing" /><ref name="kiselyov" />
第298行: 第298行:  
'''把 Print 换成任意可计算操作 f:quine 是 SRT 在 f = Print 上的特例'''。上面那个 quine 里的 `print(c % c)` 可以立刻换成'''任意可计算操作'''。看下面这个程序——它不再"打印自己",而是"先把自己的源码施加一个变换 f、再打印结果"(这里 f = "给每一行加上行号"):
 
'''把 Print 换成任意可计算操作 f:quine 是 SRT 在 f = Print 上的特例'''。上面那个 quine 里的 `print(c % c)` 可以立刻换成'''任意可计算操作'''。看下面这个程序——它不再"打印自己",而是"先把自己的源码施加一个变换 f、再打印结果"(这里 f = "给每一行加上行号"):
   −
```python
+
<syntaxhighlight lang="python3">
 
def f(s):
 
def f(s):
 
     return '\n'.join(f'{i:2d}: {line}'
 
     return '\n'.join(f'{i:2d}: {line}'
第309行: 第309行:  
print(f(src % src))'''
 
print(f(src % src))'''
 
print(f(c % c))
 
print(f(c % c))
−
```
+
</syntaxhighlight>
    
`c % c` 仍然是"自己的源码",但最后一行不再是 `print(c % c)`,而是 `print(f(src % src))`——也就是先调用 f 处理自己的源码、再打印结果。这个程序满足
 
`c % c` 仍然是"自己的源码",但最后一行不再是 `print(c % c)`,而是 `print(f(src % src))`——也就是先调用 f 处理自己的源码、再打印结果。这个程序满足

导航菜单