Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number

Comment on

( #3333=superdoc: print w/replies, xml ) Need Help??

I find ~> not visually distinct enough (otherwise, it might be my first choice). [Update: Alternately, in some fonts it doesn't even look like an arrow and so reads more like "approximately greater than". The combination of the two possible presentations makes it a particularly bad choice, IMHO.]

The name "safe de-ref" means more to me than what is being proposed here. What is being proposed is merely the more specific "undef-safe de-ref". As such, the closest representation of what it does is the &&-> choice (a syntax which I'm pretty sure I've seen in some other language, though I don't recall which).

However, it isn't actually &&-> so I'd vote for &-> because it is that much less ugly and is mnemonic for "slightly different from &&->". In case some don't quite follow... If we had an operator that was to "&&" as the new "//" is to "||", then that operator would be the ideal one to paste in front of "->" to get this new "undef-safe de-ref" operator. But we don't. Now, "&&->" naturally implies "de-ref if true" which is only slightly different from "de-ref if defined". So "&->" is about as close as we can get to "de-ref if defined" by virtue of being "slightly different from 'de-ref if true'". But we do have "&" so you could interpret "&->" as "bit-wise 'and' then de-ref" but that just makes no sense.

So my choice would be for "&->". But part of my reason for that choice (despite it being somewhat ugly) is because I would also like to have something worthy of being called "safe de-ref".

I'd like to also have "->?" added to Perl 5. Since "safe de-ref" is too vague, we should call "->?" the "de-ref if possible" operator.

So $obj->?blurg(@args); would be roughly equivalent to $obj->blurg(@args) if $obj->?can("blurg"); (note how I had to use "->?" in order to safely call can() on something that might be neither an object nor a class).

But my hopes for "->?" are even better realized if, in the process of extending Perl 5's de-ref operators, we also add the long-ago-proposed de-ref operators of "->@" and "->%". Because "is this a hash reference?" is a complete mess in Perl 5.

It started with ref which had the poor design of not thinking blessed hash refs are hash refs. Then we added ->isa("HASH") which was more accurate in several ways but rather sucked because you can't safely call ->isa(...) on some random scalar. Then chromatic's fetish for forcing everybody else to do things his way so he wouldn't have to make a minor improvement to his used-only-in-testing module got pushed as a moral stance against making isa actually convenient as well as useful so that problem just gets worse. So I've resorted to things like eval { $ref->{''} } but that gets unacceptably complicated because you might have a version of Perl that issues warnings (not suppressed by eval) when you do something that it thinks might be an attempt to use the deprecated "pseudo-hash" feature.

So $ref->?% or even defined $ref->?% would be a nice replacement for all of the prior "is a HASH?" techniques. It'd even work for blessed references to scalars that overload hash de-ref'ing.

And even if we don't get ->%, I'd still be happy to have $ref->?isa("HASH") which I don't believe would violate chromatic's edicts about how I should be allowed to use isa() (but would require overload to properly either fudge @ISA or override isa() when an object overloads a data de-ref operation if we want ->?isa to be completely accurate).

And, of course, you could do things like:

$opt = $ref->?{optName} // $ref->?[optNumb()] // ref->?();

for when you don't really care which succeeded or why and you just want the result (or undef).

Thanks much to Tanktalus for helping me with these ideas.

Update: I'd also be happy with just implementing ->? (but my guess is that many will want "de-ref if defined" w/o having to also silently ignore the extra "de-ref isn't possible" cases). But I'd be quite sad if ->? were used to implement just "de-ref if defined".

- tye        

In reply to Re: What operator should perl5porters use for safe dereferencing? (&-> and ->?) by tye
in thread What operator should perl5porters use for safe dereferencing? by de-merphq

Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":

  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?

    What's my password?
    Create A New User
    [1nickt]: Discipulus Do the nutritionists in Eataly recommend as we were taught: "Breakfast like a king, lunch like a duke, dinner like a pauper" ?
    [Discipulus]: ahah they could reccomend what they want.. or they can prepare for me. I eat a lot at breakfast and even more at dinner, but differntly from other Romans, we make dinner at 19:00 so i can elaborate well

    How do I use this? | Other CB clients
    Other Users?
    Others pondering the Monastery: (11)
    As of 2017-10-19 10:47 GMT
    Find Nodes?
      Voting Booth?
      My fridge is mostly full of:

      Results (252 votes). Check out past polls.