Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

If you ever tried implementing a language, you'll see that dynamic scope is actually much easier. So it's not that language x doesn't implement dynamic scope. It's that language x doesn't actually implement lexical scope so it's left with dynamic scope :)


I'm not sure I understand your sentence (did you mean language x does implement dynamic scope?), but I feel obliged to mention Perl offers lexical scoping as well--within each file and each block.


If you're a lazy language designer dynamic scope sort of emerges from the design proces while one really has to do extra work to support lexical scoping in a language.


Perl 5 has dynamic scoping for backward compatibility with Perl 4, which had only dynamic scoping, and not only that, it botched it so that this code didn't work right:

    sub greet {
        local ($who) = @_;
        print "hello, $who\n";
    }

    $who = "world";
    &greet($who);
This would print, "hello, " with a newline, due to a design bug called "variable suicide", which has been fixed in newer Perls.

Needless to say, this made the extract-subroutine refactoring quite a bit more trouble in Perl 4.


It doesn't just have it for backwards compatibility, it's still a very useful feature in some cases:

    sub foo {
        local $ENV{HOME} = "/foo/bar";
        Code::I::Don't::Own();
    }
    foo();
Having dynamic scope here ensures that the foreign code will use the environment I want without me having to alter it.


Perl 6 also has dynamic scoping. But I don't think they kept it just for backward compatibility with Perl 4 & 5 :)

Here is another example where dynamic scoping can indeed be very useful:

    sub bar { 'bar' }
    sub baz { bar() }

    sub foo {
        no warnings 'redefine';
        local *bar = sub { 'My Bar' };
        baz();
    }

    say foo();   # => 'My Bar'
    say baz();   # => 'bar'




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: