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.
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.
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.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'