It seems to me that the majority of recommended programming practices here on PM involve
avoiding dynamic scoping as much as possible. Examples:
- Using strict means making the vast majority of your variables lexical my vars.
- How many Anonymous Monks have been scolded (with good reason) for trying to use a variable as the name of another variable? String references (which only work in dynamic scoping) are generally considered a Bad Thing around here; we usually recommend hashes for this.
I've tried to think of situations when dynamic scoping turns out to be convenient. Here's what I've come up with:
- To facilitate object polymorphism, method calls should be looked up at runtime.
- Importing symbols into the caller's namespace: Most commonly used when importing subroutines. However, importing variables can be done lexically: why not just pass a reference in the use statement?
- AUTOLOAD
- Builtins, @_, $_, etc. However, Perl6 is moving away towards dynamically scoped builtins. It's my understanding that $_ will be lexical. Also, things like $/ and $\ will become filehandle properties.
- Aliasing *_ = \$var. But again, Perl6 will allow this to happen lexically with the := operator (if I'm not mistakened).
- Laziness when writing one-liners and such; no need to declare vars.
It dawned on me that the problems addressed well by dynamic scoping involve only subroutines (including method calls). I don't see any other big problems addressed that can't be dealt with lexically. I don't pretend to know a lot about language design, so I may be missing something obvious here. Anyway, after thinking about this for a while I concluded,
why not just make subroutine/method calls dynamically scoped and force everything else lexical?
Perhaps the answer is just as simple as "Perl shouldn't force anything, even our scoping preferences." But I want to know what you all think. Also, is dynamic scoping still hanging around just for posterity? Is Perl moving away from dynamic scoping?
Thanks,
blokhead
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, details, 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, summary, 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: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.