Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: Unexpected parsing

by ikegami (Pope)
on Dec 16, 2009 at 08:18 UTC ( #812992=note: print w/replies, xml ) Need Help??


in reply to Unexpected parsing

and delighting in the potential for unreadable code coming from using a conditional operator as an lvalue

It takes next to nothing to make the cond op unreadable, but using it as an lvalue itself doesn't make it unreadable.

($axis ? $x : $y) += $distance;

I can't see why 1 ? my $c : my $d would be parsed that way, but 1 ? my $c : $d wouldn't.

It appears to be another case where heuristics enter into play.

my is a valid attribute name, so : my is presumed to be an attribute.

$d is not a valid attribute name, so : $d is taken to be the else expression of the conditional.

Untested, but parens should clear that up.

1 ? (my $c : shared) : ... # shared is an attribute -vs- 1 ? (my $c) : shared # shared is func call

perl -MO=Deparse -e 'my $c; 1 ? $c : my $d; $d'

Note that conditionally executing my officially results in undefined behaviour.

Replies are listed 'Best First'.
Re^2: Unexpected parsing
by JadeNB (Chaplain) on Dec 16, 2009 at 08:30 UTC

    my is a valid attribute name, so : my is presumed to be an attribute.

    $d is not a valid attribute name, so : $d is taken to be the else expression of the conditional.

    Thanks for the explanation! (I eventually figured out that it must be something like that, and updated my post; but probably it was after you had already begun yours.)

    Since the word ‘attribute’ does not occur in perlop or perlsyn, and since no other punctuation mark requires a visit to perlfunc to figure out how it parses, I wonder if it might be appropriate for the precedence table to mention this unexpected (by me) interaction?

    Note that conditionally executing my is officially undefined behaviour.

    Good to know, thanks. Is there any unified list of officially undefined things? I know, for example, by luck, that $i++ + ++$i can officially do whatever it wants, but I had no idea about this; who knows what other corner cases I'm missing?

      I wonder if it might be appropriate for the precedence table to mention this unexpected (by me) interaction?
      No, I don't think so. The ':' isn't an operator, so it has nothing to do with precedence. It doesn't belong in a precedence table. Determining whether something is an operator (or part of an operator) or not isn't dealt with with the operator precedence table.
      Since the word ‘attribute’ does not occur in perlop or perlsyn, and since no other punctuation mark requires a visit to perlfunc to figure out how it parses
      But you only find something about attributes in perlfunc because my was specially added to perlfunc; my isn't a function. The details are in perlsub, where you would also go for punctuation as prototypes and some cases of parenthesis.
      Is there any unified list of officially undefined things?
      Not that I know of. But by all means, feel free to write up a list and submit is as a patch. Writing documentation doesn't require any coding language, which means most people can do it.

        my isn't a function

        my is just as much a function as print. It just happens to have a compile-time effect too.

        But you only find something about attributes in perlfunc because my was specially added to perlfunc; my isn't a function. The details are in perlsub, where you would also go for punctuation as prototypes and some cases of parenthesis.

        Why do you say that my isn't a function? (I'm not arguing, just curious.) Do you mean it in the Lispy sense that it's a ‘special form’ (meaning, I suppose, that I couldn't write it myself in plain Perl)?

        I was just suggesting that :-for-attribute-list could be mentioned in perlop because it affects parsing (which is, after all, what one is trying to figure out when looking at a precedence table), not because it is itself an operator; but, aside from the fact that that idea probably doesn't make much sense on its own (should we mention every interaction of symbols?), what ikegami had said eventually sunk in and I realised that there's no reason to document the effect of trying to write officially undefined code.

        Not that I know of. But by all means, feel free to write up a list and submit is as a patch. Writing documentation doesn't require any coding language, which means most people can do it.

        The problem is that, as I say, I don't know the contents of such a list, and I'm not sure how I could figure it out. “Officially undefined” is basically an act of will on the part of the language designers; there's no way for me alone to tell the difference between “behaves this way but undocumented” and “behaves this way by chance, but is explicitly allowed to be changed on a whim”—because the difference is not in the code, but in the will of (I guess) the pumpking.

      Is there any unified list of officially undefined things?

      That's the only one that comes to mind. It's documented (too specifically) in perlsyn under statement modifiers (my ... if ...;).

      I know, for example, by luck, that $i++ + ++$i can officially do whatever it wants

      That one's simply undocumented.

      I wonder if it might be appropriate for the precedence table to mention this unexpected (by me) interaction?

      I don't see why not, although I don't think it'll ever be an issue in legit code (but my brain is too slow to make sure of that right now). Maybe as a warning in the doc for the cond op.

        That one's simply undocumented.
        From Auto increment and Auto decrement:
        Note that just as in C, Perl doesn't define when the variable is incremented or decremented. You just know it will be done sometime before or after the value is returned. This also means that modifying a variable twice in the same statement will lead to undefined behaviour.
        (with the specific example I mentioned listed under “Don't do that”).

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (7)
As of 2021-05-11 10:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Perl 7 will be out ...





    Results (116 votes). Check out past polls.

    Notices?