Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re^7: The Null Mull (or, when OO needs more O)

by dragonchild (Archbishop)
on Nov 30, 2004 at 14:22 UTC ( [id://411192]=note: print w/replies, xml ) Need Help??


in reply to Re^6: The Null Mull (or, when OO needs more O)
in thread The Null Mull (or, when OO needs more O)

Would PL_YES (!!1) and PL_NO (!!0) be similarly globaller-than-global globals? If so, how would one go about overriding them? Or, are we overriding the undef() function when we do the above-mentioned trick? If so, why aren't we using CORE::undef() instead of the internals trick?

Being right, does not endow the right to be rude; politeness costs nothing.
Being unknowing, is not the same as being stupid.
Expressing a contrary opinion, whether to the individual or the group, is more often a sign of deeper thought than of cantankerous belligerence.
Do not mistake your goals as the only goals; your opinion as the only opinion; your confidence as correctness. Saying you know better is not the same as explaining you know better.

Replies are listed 'Best First'.
Re^8: The Null Mull (or, when OO needs more O)
by diotalevi (Canon) on Nov 30, 2004 at 14:32 UTC

    yes, they are also globaller-than-global globals. you can see then in perlapi.h look for "pl_sv_". you don't ever overload them. you break everyone else's code when you change these values. in fact, this entire avenue is just off limits because you can't change the behaviour of undef, yes, and no without changing it for every piece of every module loaded, everywhere.

    the only case where you could possibly, maybe, change these values would be during small, discrete sections of your own code where you overload your value on entering and remove the overload before calling any functions, magic or explict, and before exiting. you'd have to have vetted all your input values to know that nothing has been tied, overloaded, or somehow has get or set magic. The point to this paranoia is that the none of the code you've included from cpan or from the core distribution is going to expect that true, false, and undefined have changed. It will break all other code that depends on them.

      I understand that overloading them is asking for trouble. I want to know how to ask for trouble, if doing that is what I want to do. Of course, one shouldn't do this in production. However, it may be appropriate to do it in some really weird circumstance. Knowing how to do it is only half the battle - knowing when not to do it is the other half.

      So, how do you do it? :-)

      Being right, does not endow the right to be rude; politeness costs nothing.
      Being unknowing, is not the same as being stupid.
      Expressing a contrary opinion, whether to the individual or the group, is more often a sign of deeper thought than of cantankerous belligerence.
      Do not mistake your goals as the only goals; your opinion as the only opinion; your confidence as correctness. Saying you know better is not the same as explaining you know better.

        You use the &Internals::SvREADONLY( \ undef, 0 ) trick to allow you to overwrite it. I'm not actually sure how you'd get another undef to reset the global undef value back to undef. Also, there are a lot of places where assumptions are made that the canonical undefined value is always undefined and has some expected characteristics at a C level. You'll run into various built in functions that test for truth and definedness in ways that will break after altering undef. I'm pretty sure of that anyway. So if you change PL_sv_undef then you probably also need to read all of the source for the build-in functions you're using *and* be sure that you control all the user-side perl that will have your change in scope.

        This whole thing sounds so violently wrong that even setting $[ is trivial by comparison. I can't imagine any circumstance where you'd want to invoke so much concentrated chaos. This isn't like using a source filter or some behaviour that is expected to be naughty. So between just us bears, this is probably leads to justifiable homicide. I really don't think there is any sane way to use this. It probably doesn't belong in your bag of tricks.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (2)
As of 2024-03-19 04:28 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found