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


in reply to Re: Unexpected parsing
in thread Unexpected parsing

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?

Replies are listed 'Best First'.
Re^3: Unexpected parsing
by JavaFan (Canon) on Dec 16, 2009 at 11:43 UTC
    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.

        Why do you say that my isn't a function?
        Because, IMO, functions take values (even if they are references or aliases), do something when called at runtime, and return zero or more values.

        But for my, things are different. Its effects are mostly at compile time. It takes names, not values (if something takes values, you can replace the value with any expression returning said value). There's no prototype for my. The only things that act like my are local, our, and to some extent, state. None of them are functions. return isn't a function either.

        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)
        Uhm, is there any token that doesn't affect parsing in some way? If you're going to add colons, why not semi-colons? Braces?
        "undefined" doesn't so much mean "is explicitly allowed to be changed on a whim". That's more along the lines of undocumented. It means bad stuff can happen if you do it.
Re^3: Unexpected parsing
by ikegami (Patriarch) on Dec 16, 2009 at 16:59 UTC

    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”).