在Perl 5.8下,这段代码的行为与在Perl 5.12下的行为不同:
my $badcode = sub { 1 / 0 };
print "Made it past the bad code.\n";
Run Code Online (Sandbox Code Playgroud)
当我在5.8下运行它时,即使我从未执行分区,我也会收到错误:
[brock@chase tmp]$ /usr/bin/perl -v This is perl, v5.8.8 built for i486-linux-gnu-thread-multi [brock@chase tmp]$ /usr/bin/perl badcode.pl Illegal division by zero at badcode.pl line 1. [brock@chase tmp]$ /usr/local/bin/perl -v This is perl 5, version 12, subversion 0 (v5.12.0) built for i686-linux [brock@chase tmp]$ /usr/local/bin/perl badcode.pl Made it past the bad code.
在perl 5.10.1下,它的行为与在5.12下的行为相同:
brock@laptop:/var/tmp$ perl -v This is perl, v5.10.1 (*) built …
在"The Seasoned Schemer"的第16章中,作者定义了一个递归过程"depth",它返回'嵌套在n个列表中的披萨,例如(深度3)是(((披萨))).然后他们将其改进为"depthM",使用set缓存其返回值!在列表Ns和Rs中,它们共同形成一个查找表,因此如果达到之前看到的返回值,则不必一直向下递减.例如,如果我已经计算过(depthM 8),当我稍后计算(depthM 9)时,我只查找(depthM 8)的返回值并将其缩小为null,而不是一直递归到(depthM 0) .
但随后他们在程序中移动Ns和Rs,并用"let"将它们初始化为null.为什么这不能完全破坏缓存返回值的点?从一些实验来看,似乎Ns和Rs在每次调用"depthM"时都会重新初始化.
我误解了他们的观点吗?
我想我的问题是这样的:在Scheme中有没有办法让词法范围的变量在调用过程之间保留它们的值,就像在Perl 5.10中用"状态"变量一样?