2012-02-23 9 views
1
私はこの問題に取り組んでいる

を結合-shallowと私は答えました:静的動的に結合し、深い

:13

動的バインディング-deep:2 < - 私はこの1についてはよく分からないが

は、動的バインディング-shallow:2 <を - 私はこの1

についてはよく分からないことが正しいのですか?

以下のプログラムをパスカルのような言語で考えてみましょう。 言語の出力はどのような静的スコープですか?言語の出力は動的にスコープされています ディープバインディングを使用していますか?言語の出力は動的スコープで、 は浅いバインディングを使用していますか?

Program main; 
    x: integer := 2; 
    y: integer := 1; 
procedure f3(z: integer) 
    begin 
     x = z + x + y; 
    end 
procedure f2(p: procedure, z: integer) 
    int x := 5; 
    begin 
       p(z) 
    end 
procedure f1(z: integer) 
     int y := z 
    begin 
    f2(f3,y); 
    end 

begin /* main program */ 
f1(4); 
     print(x) 
end 
+0

[静的および動的スコープ]の可能な複製(http://stackoverflow.com/questions/9421863/statically-and-dynamically-scopes) – skaffman

+0

それは重複していない、別の質問です。 – nullException

答えて

1

静的スコープとdynamic-scope-with-shallow-bindingのケースについては、それらを試してみてはどうでしょうか?静的スコープでのPerlの使用:

my $x = 2; 
my $y = 1; 
sub f3($) { 
    my $z = shift; 
    $x = $z + $x + $y; 
} 
sub f2($$) { 
    my ($p, $z) = @_; 
    my $x = 5; 
    $p->($z); 
} 
sub f1($) { 
    my $z = shift; 
    my $y = $z; 
    f2(\&f3, $y); 
} 
f1(4); 
print "$x\n"; 

私は(4 + 2 + 1ある)7を取得します。 mylocalに変更して、浅いバインディングでダイナミックスコープを取得すると、予測通りに2と表示されます。

ディープバインディングを使用してダイナミックスコープをテストするのは難しいため、サポートする言語はほとんどないためです。 this answer a while backでは、スカラーへの参照のハッシュを渡すことによって "手作業"のディープバインディングを実装したPerlコードを公開しました。その同じアプローチを使用して:

#!/usr/bin/perl -w 

use warnings; 
use strict; 

# Create a new scalar, initialize it to the specified value, 
# and return a reference to it: 
sub new_scalar($) 
    { return \(shift); } 

# Bind the specified procedure to the specified environment: 
sub bind_proc(\%$) 
{ 
    my $V = { %{+shift} }; 
    my $f = shift; 
    return sub { $f->($V, @_); }; 
} 

my $V = {}; 

$V->{x} = new_scalar 2; 
$V->{y} = new_scalar 1; 

sub f3(\%$) { 
    my $V = shift; 
    my $z = $V->{z};     # save existing z 
    $V->{z} = new_scalar shift;  # create & initialize new z 
    ${$V->{x}} = ${$V->{z}} + ${$V->{x}} + ${$V->{y}}; 
    $V->{z} = $z;     # restore old z 
} 
sub f2(\%$$) { 
    my $V = shift; 
    my $p = shift; 
    my $z = $V->{z};     # save existing z 
    $V->{z} = new_scalar shift;  # create & initialize new z 
    my $x = $V->{x};     # save existing x 
    $V->{x} = new_scalar 5;   # create & initialize new x 
    $p->(${$V->{z}}); 
    $V->{x} = $x;     # restore old x 
    $V->{z} = $z;     # restore old z 
} 
sub f1(\%$) { 
    my $V = shift; 
    my $z = $V->{z};     # save existing z 
    $V->{z} = new_scalar shift;  # create & initialize new z 
    my $y = $V->{y};     # save existing y 
    $V->{y} = new_scalar ${$V->{z}}; # create & initialize new y 
    f2(%$V, bind_proc(%$V, \&f3), ${$V->{y}}); 
    $V->{y} = $y;     # restore old y 
    $V->{z} = $z;     # restore old z 
} 
f1(%$V, 4); 
print "${$V->{x}}\n"; 

__END__ 

私は(4 + 2 + 4ある)10を取得します。

関連する問題