12

他の言語から来た人のためのRプログラミングでは、ジョン・クックは次のように述べています。

Rは字句スコープを使用し、S-PLUSは静的スコープを使用します。特にクロージャを使用する場合、違いは微妙な場合があります。

語彙スコープと静的スコープは同義語であると常に考えていたので、これは奇妙だと思いました。

字句スコープと静的スコープには明確な属性がありますか、それともこれはコミュニティからコミュニティへ、人から人へと変化する区別ですか?もしそうなら、一般的なキャンプとは何ですか、そして私は彼らがこれらの言葉を使うときに誰かが意味することをよりよく理解できるようにそれらをどのように区別するのですか?

4

2 に答える 2

10

ウィキペディア(および私) は、「レキシカル スコープ」と「静的スコープ」という用語が同義であることに同意します。 この Lua の議論では、区別をしようとしていますが、その区別が何であるかについて人々が同意していないことに注意してください。:-)

試行された区別は、ネストされた状態で主に(のみ?)発生する最新の実行レコードとは異なる関数アクティベーションレコード(「スタックブロック」)の名前にアクセスすることに関係しているように見えます機能:

function f:
    var x
    function h:
        var y
        use(y)  -- obviously, accesses y in current activation of h
        use(x)  -- the question is, which x does this access?

レキシカル スコープでは、答えは「 のアクティベーションfと呼ばれる のアクティベーションh」であり、ダイナミック スコープでは、「」という名前の変数を持つ最新のアクティベーションx(ではない可能性がありますf) を意味します。一方、言語がxまったく使用を禁止している場合x、答えは「エラー」なので、「これはどれですか」という質問はありません。:-) この 3 番目のケースを参照するために「静的スコープ」を使用する人もいるようです。

于 2012-04-21T20:25:03.793 に答える
4

R の公式ドキュメントでは、R と S-plus の範囲の違いについても説明しています: http://cran.r-project.org/doc/manuals/R-intro.html#Scope

リンクからの例は、次のように簡略化できます。

 cube <- function(n) {
   sq <- function() n*n
   n*sq()
 }

S-Plus と R の結果は異なります。

 ## first evaluation in S
 S> cube(2)
 Error in sq(): Object "n" not found
 Dumped
 S> n <- 3
 S> cube(2)
 [1] 18
 ## then the same function evaluated in R
 R> cube(2)
 [1] 8

個人的にはRで変数を扱う方が自然だと思います。

于 2012-07-09T18:42:27.780 に答える