小编Bro*_*ock的帖子

对于Perl 5.8与5.10和5.12的子程序中的代码延迟评估有什么区别?

在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 …

perl perl5.8

8
推荐指数
1
解决办法
273
查看次数

缓存以前的方案中的过程返回值

在"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中用"状态"变量一样?

scheme

0
推荐指数
1
解决办法
261
查看次数

标签 统计

perl ×1

perl5.8 ×1

scheme ×1