develooper Front page | perl.perl6.users | Postings from January 2019

Re: Bad syntax check

Thread Previous | Thread Next
From:
ToddAndMargo via perl6-users
Date:
January 4, 2019 19:58
Subject:
Re: Bad syntax check
Message ID:
4896ebd3-1b92-213c-22bf-ca10584551e2@zoho.com
On 1/3/19 1:52 AM, JJ Merelo wrote:
> 
> 
> El mié., 2 ene. 2019 a las 21:04, ToddAndMargo via perl6-users 
> (<perl6-users@perl.org <mailto:perl6-users@perl.org>>) escribió:
> 
>     Dear Perl 6 Developers,
> 
>     Fedora 29, x64
>     Xfce 4.13
> 
>     $ perl6 -v
>           This is Rakudo version 2018.11 built on MoarVM version
>           2018.11 implementing Perl 6.d.
> 
>     I am constantly improving (changing things) in my subs,
>     etc..  As such, the things I return often change.
> 
>     Because of this, I have a found something I just do not like
>     in the checker (Perl6 -c xxx) and the run time compiler.
> 
>     Here is a simplified sample code with the error in it:
> 
>     <code RtnBooBoo.pl6>
>     #!/usr/bin/env perl6
> 
>     sub AddThree( Int $a, Int $b, Int $c ) {
>          my Int $d = $a + $b + $c;
>          return $d;
>     }
> 
>     my Int $X = 0;
>     my Int $Y = 0;
> 
>     ( $X, $Y ) = AddThree( 1, 2, 3 );
>     say "X = <$X>\tY = <$Y>";
>     </code RtnBooBoo.pl6>
> 
> 
>     The error is that the subroutine is only returning one
>     value and two are trying to be read.
> 
>     And the checker passes it!
> 
>           $ perl6 -c RtnBooBoo.pl6
>           Syntax OK
> 
>     No, it is not okay.  The sub and the caller do not match up!
> 
> 
>     If you run the flawed code, you get:
> 
>           $ RtnBooBoo.pl6
>           Use of uninitialized value of type Int in string context.
>           Methods .^name, .perl, .gist, or .say can be used to stringify
>           it to something meaningful.  in block <unit> at ./RtnBooBoo.pl6
>           line 12
> 
>           X = <6>    Y = <>
> 
> This is a runtime error, not a compile time error. And it's got nothing, 
> or very little, to do with the routine itself. When you are doing the 
> assignment of x and y, you are giving Y a null value. There's no way the 
> static type checker (run by -c) knows this. You know, Turing halting 
> problem and all that.
> 
> 
>     Which is a bizarre warning (it does not stop on this error).  And
> 
> 
> A warning, by definition, does not stop. It's simply saying: hey, you 
> are trying to convert into a string something that cannot be converted 
> (a null value). Let's say it's nothing (empty string), and let's leave 
> it at that.
> 
>     it is also not the error.  The error was that the return line's
>     returned variables and the caller do not match up.  Not an
>     uninitialized value.
> 
> 
> There's no type checking _at return time_ it happens _at assignment 
> time_. And that time is runtime, not compile time.
> 
> 
>     If you send too few variables to a sub, you get the finger shaken
>     at you.  The return should also have the same checking capability.
> 
> 
> You can assign a null value to any typed variable. That's not a problem. 
> The problem is trying to print it.
> 
> 
>     Would you guys please consider improving the checker and the compiler?
> 
> 
> I would say that would need solving the Turing halting problem (or 
> variation thereof) https://en.wikipedia.org/wiki/Halting_problem So 
> that's not within reach of a bunch of Perl programmers, even if hubris 
> is one of our qualities.
> 
> Cheers
> 
> JJ

Hi JJ,

Indeed.  That does not mean I like the way it is done.

You know, if you guys ever decide to allow more than one
return type without having to create a new type, that would
make me happy:

sub AddThree( Int $a, Int $b, Int $c --> Str, Int ) {
     my Int $d = $a + $b + $c;
     return ( "a+b+c=", $d );
}

I would post it as an RFE at the bug reporter, but I don't feel
like the ...

-T

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About