更改
→建构性的自指
源代码1:自打印程序源代码
源代码1:自打印程序源代码
这里面的“\n”表示换行符,即如果执行Print(‘A\nB’),则程序会输出下面的字符串:
这里面的“\n”表示换行符,即如果执行<code>Print(‘A\nB’)</code>,则程序会输出下面的字符串:
<code>A</code>
<code>A</code>
<code>B</code>
<code>B</code>
“+”表示将两个字符串进行串联形成一个新的字符串,例如A=’123’,B=’456’,则A+B=’123456’。
“+”表示将两个字符串进行串联形成一个新的字符串,例如<code>A=’123’,B=’456’,则A+B=’123456’</code>。
这个自打印程序调用了一个简单的解码函数<math>p(q)</math>,<math>p</math>的作用是将字符串<math>q</math>变换成更浅一层次的字符串。例如,如果<math>q</math>是“\\\’\\’\\n\\”,那么<math>p</math>这个函数就会计算输出“\’’\n\”。也就是说<math>p</math>完成了一组映射:它把“\\”映射成“\”,把“\’”映射成“’”,而把“\n”映射成回车符。显然<math>p</math>是可以写出来的。我们知道,由引号的引用可以形成更加深层次的虚拟世界(参见上一小节)。所以<math>p(q)</math>的作用就是让字符串<math>q</math>弹出一层虚拟世界。由于<math>p</math>的作用很简单,我们假设它是一个系统自带的函数,因此就不在源代码1中给出<math>p</math>的实现代码了。
S(x)这个程序中包含了过多的“\”和“’”符号,这就导致我们理解源代码1稍显困难,下面我们将把该程序表示成下面的图,从而让读者看得更清晰一些:
S(x)这个程序中包含了过多的“\”和“’”符号,这就导致我们理解源代码1稍显困难,下面我们将把该程序表示成下面的图,从而让读者看得更清晰一些: