Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re^5: Unifying namespaces of @name and $name to simplify dereferencing? (declaration of typed references)

by Eily (Monsignor)
on Mar 27, 2016 at 20:20 UTC ( #1158902=note: print w/replies, xml ) Need Help??


in reply to Re^4: Unifying namespaces of @name and $name to simplify dereferencing? (declaration of typed references)
in thread Unifying namespaces of @name and $name to simplify dereferencing?

I didn't think to have a block scoped switching of syntax, don't think this would be wise.
That's block scoped the same way other pragmas are block scoped, if you want to use them on a whole file that's just fine, but if you want to be able to have a finer control over when the aliasing happens, (because you think the aliasing looks like you break the encapsulation on objects, or one of the two variables has magic that the other bypasses (once again, by magic I mostly mean ties) and you'd rather have a compile time than a run time bug) you should be able to.

or @a should be an alias of @$a and always reflect the list form of wherever $a points.
That's not possible, because this means that \@a would not have a constant value for the duration of the program. And you can't magic your way out of it because sometimes only the stringified ref is kept (as the key of a hash).

As for your declaration proposition, I'll say that offering a better safety net is always a good idea. I've been bitten before because I absentmindedly used the wrong brackets for my type, like $var->{3} when really I was thinking about an array the whole time, but for some reason I confused the two, or my finger just went on typing the brackets they were told to use the X previous time in a row. So ++ for compile time types :).

  • Comment on Re^5: Unifying namespaces of @name and $name to simplify dereferencing? (declaration of typed references)

Replies are listed 'Best First'.
Re^6: Unifying namespaces of @name and $name to simplify dereferencing? (declaration of typed references)
by LanX (Archbishop) on Mar 27, 2016 at 20:49 UTC
    > That's not possible, because this means that \@a would not have a constant value for the duration of the program. 

    With a tied array it should be feasable to always access @$ref. ( well quite slow but good enough for a showcase.)

    > And you can't magic your way out of it 

    These variables are scoped and easy to identify (at least lexicals) you can just replace every @arr with @$are at compile time or in a macro substitution.

    >  because sometimes only the stringified ref is kept (as the key of a hash).

    I doubt that's documented or guaranteed behavior.

    At least with stash variables you are free to change the reference by aliasing.

    Just try *a=\@b; and see what \@a returns. :)

    Cheers Rolf
    (addicted to the Perl Programming Language and ☆☆☆☆ :)
    Je suis Charlie!

    update

    furthermore this allows changing the underlying reference.

    use 5.22.0; use feature qw/say refaliasing/; no warnings "experimental::refaliasing"; my @a=(1,2,3); my @b=(3,2,1); say \@a; \@a=\@b; say \@a;

      I doubt that's documented or guaranteed behavior.
      It's present in the Inside Out objects documentation at least. And the perlref doc states
      Using a reference as a string produces [...] the numeric address expressed in hex.
      Which is used to see if the two references refer to the same location. There's nothing that explictly states that a lexical variable will have a constant address for the duration of its scope though. And I didn't know that this was already broken by the experimental refaliasing, because I would expect that CPAN modules use constructs like process(@a) unless $processed{\@a}; which would break if the address is not constant. At least refaliasing makes it explicit that you are "overwriting the reference", because \@a=\@b; is not valid in "classic perl", so you're either going to guess what it does, or think it's a syntax error. Same goes with your declaration proposition. The declaration syntax wouldn't just be about type security, but rather about new features being a syntax error if used outside their scope.

      I didn't mention globs because while they make it easy to have an array always be the thing a references refers to, they can't be used with lexicals alone. Once again though, this was for lack of knowledge that aliasing is possible between lexicals. I now know that your proposition can be implemented (or at least emulated) using existing features.

      I still like $array being read-only better though, because it would make it possible to have a reference bound to your array for ease of use, without the side effects, or even misleading perl newcomers into believing that $array = [1..3]; overwrites the values of the array instead of creating a brand new one.

      Edit: tr/$/&/ in html escape :)

Re^6: Unifying namespaces of @name and $name to simplify dereferencing? (declaration of typed references)
by LanX (Archbishop) on Mar 27, 2016 at 21:21 UTC
    > So ++ for compile time types :).

    And do you think this would improve the usability of Perl for beginners? (I do)

    Cheers Rolf
    (addicted to the Perl Programming Language and ☆☆☆☆ :)
    Je suis Charlie!

      Could rather than would. I'm sure a significant portion of them would avoid a syntax that looks like additional effort (because who doesn't know that error messages are more effort than debugging blindly and getting confusing behaviour?) as they already avoid strict which is just one line and not "extra noise".

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1158902]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (3)
As of 2019-11-21 06:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Strict and warnings: which comes first?



    Results (103 votes). Check out past polls.

    Notices?