Your skill will accomplishwhat the force of many cannot PerlMonks

### Re:^3 Passing subroutines as arguments

by arturo (Vicar)
 on May 08, 2003 at 20:24 UTC ( #256668=note: print w/replies, xml ) Need Help??

in reply to Re: Re: Passing subroutines as arguments
in thread Passing subroutines as arguments

Read perldiag for an explanation of the error message; the error message does not lie, you're attempting to compare values, at least one of which is undefined. There's only one comparison in the code you post, so assuming that's the "offending" line, the problem is that one of \$a and \$b is not initialized in the call to sum. Why that would be so depends on how that subroutine came to be called, and if you look at the else clause of your conditional in the sum subroutine, you'll see the problem; what you pass to the call to sum there are three things: \$term, and the results of calling the sub it points to on \$a and \$b. Yet your subroutine's ... ummm... signature calls for there to be four objects, so the result is that when that recursive call is made, \$b is undefined.

HTH

If not P, what? Q maybe?
"Sidney Morgenbesser"

Replies are listed 'Best First'.
Re: Re:^3 Passing subroutines as arguments
by mvaline (Friar) on May 08, 2003 at 20:37 UTC
Thanks... sorry for the stupid mistake. Here's the corrected code:
```#!/usr/bin/perl -w
# summation examples from SICP done in Perl

use strict;
use warnings;

my \$result = &sum_integers(1, 3);
print "sum_integers(1, 3) equals \$result\n";
\$result = &cube(3);
print "cube(3) equals \$result\n";
\$result = &sum_cubes(1, 3);
print "sum_cubes(1, 3) equals \$result\n";
\$result = &sum_cubes2(1, 3);
print "sum_cubes2(1, 3) equals \$result\n";

sub sum_integers {
my (\$a, \$b) = @_;
if (\$a > \$b) { return(0); }
else { return( \$a + &sum_integers((\$a + 1), \$b) ); }
}

sub cube {
my (\$a) = @_;
return( \$a * \$a * \$a );
}

sub sum_cubes {
my (\$a, \$b) = @_;
if (\$a > \$b) { return(0); }
else { return( &cube(\$a) + &sum_cubes((\$a + 1), \$b) ); }
}

sub sum {
my (\$term, \$a, \$next, \$b) = @_;
if (\$a > \$b) { return(0); }
else { return( \$term->(\$a) + &sum( \$term, (\$next->(\$a)), \$next, \$b
+) ); }
}

sub inc {
my (\$n) = @_;
return( \$n + 1 );
}

sub sum_cubes2 {
my (\$a, \$b) = @_;
return( &sum(\&cube, \$a, \&inc, \$b) );
}

Create A New User
Node Status?
node history
Node Type: note [id://256668]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (2)
As of 2017-08-20 01:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Who is your favorite scientist and why?

Results (313 votes). Check out past polls.

Notices?