http://qs321.pair.com?node_id=215700


in reply to My coding guidelines

Re point 15:

"Perl doesn't compile check the types of or even the number of arguments"

Am I missing something, or isn't that what prototypes are for?

.02

cLive ;-)

Replies are listed 'Best First'.
Re: Re: My coding guidelines
by thelenm (Vicar) on Nov 25, 2002 at 19:06 UTC
Re: Re: My coding guidelines
by jryan (Vicar) on Nov 25, 2002 at 19:18 UTC
    You are missing something, here are two examples:
    # prototypes only check arg format # i.e. (scalar/array/hash/code/glob and number of args) package Sample; sub stringify () { return ($_[0]->{data}) x $_[1] } package main; sub print_string($) { print $_[0]->stringify(1) } my $obj = bless ( {data=>"foo\n"}, 'Sample'); print_string($obj); # fine print_string(5); # uh oh... basic numbers don't have a stringify me +thod, # yet the arg passed the prototype since 5 is a sc +alar.
    And also:
    # methods don't check prototypes... at all. sub print_string_bad($) { print $_[0]->stringify() # Will pass the prototype, yet break since $_ +[1] will be # undef in stringify } print_string_bad($obj);

    Hence the reason for the general distaste for prototypes among the perl community. For most cases, they're pointless. They're only there so that you can call your own subs like perl-builtins.

Re: My coding guidelines
by Abigail-II (Bishop) on Nov 26, 2002 at 09:49 UTC
    You can't use prototypes to have the compiler check whether an argument is an integer, or an object of a certain type. Prototypes are less useful than you might think at first, and they are sometimes bloody nasty. The following doesn't do what you want:
    sub foo ($$) {....} my @bar = (1, 2); foo @bar;
    &foo isn't called with two arguments - even while @bar has two elements. Remove the prototype, and it will work as expected.

    Abigail