問題タブ [lexical-scope]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
lisp - 一般的に、「レキシカルおよび特殊変数」セマンティクスは内部でどのように実装されていますか?
CLtL2 では、スコープとエクステントの区別が明確になりました。レキシカル変数と特殊変数に関して、私の考えでは、レキシカル変数は「レキシカル スコープが無期限である」のに対して、特殊変数は「動的拡張で無期限にスコープが設定されている」というものです。</p>
私の質問は、「レキシカルおよび特殊変数」のセマンティクスは、一般的に内部でどのように実装されているのでしょうか? 「一般的に」とは、一般的な考えで十分だという意味です。Lisp の長い歴史を考えると、これらの基本的な概念を実装するために適用された多くの最適化があるはずです。
議論を開始するために、私は以下の推測を試みます。
すべては環境から始まります。環境はフレームのシーケンスであり、各フレームは名前を場所にマップするテーブルです (その値は取得および保存できます)。そのような各マッピングは、場所への名前のバインディングです。フレームは囲み関係によってリンクされます。内側のフレームの名前は、外側のフレームの同じ名前を隠すことができます。declare
また、 -d/ declaim
-ed/ proclaim
-ed が特別でない限り、Common Lisp のバインディングはデフォルトでレキシカルです。
セマンティクスには、名前の検索と新しいバインディングの作成という 2 つの側面があります。
新しいバインディングを作成します。
lambda
式、let
/let*
、labels
/flet
、macrolet
、およびそれらを使用するマクロはバインディングを作成します。レキシカル バインディングは、新しいフレームを作成し、現在のレキシカル環境を新しく作成されたフレームのエンクロージング環境にすることによって作成されます。特別なバインディング (明示的に宣言する必要があります) は、現在のパッケージ内の名前に対して作成されたスタックの一番上に新しい場所をプッシュします (スタックはおそらく名前のハッシュ テーブルによって見つけることができます) — スタックは実装に使用されます。構築フォームが終了したときに、スタックをポップすることでバインディングを分解できるように、動的エクステントを設定します (問題は、おそらくunwind-protect
ボンネットの下のようなものを使用して、そうする方法を確認することです)。名前検索。特別であると明示的に宣言されていない限り、名前のルックアップは、バインディングの作成中に確立されたフレーム リンクを介して、レキシカル環境でのルックアップにデフォルト設定されます。検索プロセスで最初に一致した名前が勝ちます。特別な名前 (明示的に宣言する必要があります) の場合、ルックアップはスタックの一番上を調べることによって提供されます。
scope - レキシカルスコープ vs ダイナミックスコープ
したがって、2 つの異なるスコープ ルールを使用して出力を把握する必要があるという問題があります。a=3
レキシカルスコープを使用した出力がandであることは知っていますがb=1
、動的スコープを使用した出力を理解するのに苦労しています。
注: 以下のコード例では C 構文を使用していますが、疑似コードとして扱いましょう。
これが私が思いついたものです。動的スコープを使用すると、 および への非ローカル参照a
がb
変更される可能性があります。だから私はa=2
( p() から戻る)、そしてb=4
( q() の中で)持っています。出力は2 4
?
r - R のレキシカル スコープ
私は最近、R にはレキシカル スコープと動的スコープの両方が利用できることを知りましたが、デフォルトではレキシカル スコープを使用します。次のケースは本当に私を混乱させました:
それが呼び出された場所ではなく、定義さf
れた環境を使用して評価されるべきではありませんか? このレキシカルスコープはどうですか?ありがとう!
javascript - Chrome 開発ツールでレキシカル スコープ (クロージャ) を使用して angularjs ディレクティブをデバッグするときの奇妙な動作
これは、test という単純なディレクティブを使用した私のコードです。
var someText にブレークポイントを追加しました。次に、outerVar を入力して、開発ツール コンソールから値を取得しようとしました。
しかし、myFuncを次のように変更すると
私は値を取得しており、さらに、開発ツール コンソールの outVar から値を出力できますが、outVar のみで、scope、el、attrs などの外部変数は出力できません ... また、console.log を実行すると他の変数についても同じ結果が得られます-機能しますが、開発ツールコンソールでは機能しません。
r - ネストされた関数 R でオブジェクトを呼び出す
まず、私は現在 R プログラミング コースを受講している R 初心者です。R の基礎を教えることは非常に不足しているので、スタック オーバーフローのすばらしい貢献者を通じて自分自身を学ぼうとしています。ネストされた関数がどのように機能するかを理解しようとしています。つまり、レキシカル スコープがどのように機能するかについても学ぶ必要があります。複数の CSV ファイルで完全なケースを計算し、今すぐ素敵なテーブルを吐き出す関数があります。
- CSV ファイルは次のとおりです: https://d396qusza40orc.cloudfront.net/rprog%2Fdata%2Fspecdata.zip
そして、ここに私のコード
/li>apply
があります.
finally
私は今、この新しい関数内で上記の関数の出力であるデータフレーム内のさまざまな変数を呼び出そうとしています:
この関数がないと、データフレームが吐き出されますが、 objectでfinally$nobs
変数を呼び出そうとすると、オブジェクトが見つからないと表示されます。この問題は、レキシカル スコープに関する私の理解不足によるものだと認識しています。教授はレキシカル スコープをあまり明確にしていないため、ネストされた関数環境内でオブジェクトを見つける方法が完全にはわかりません...助けは素晴らしいでしょう。nobs
finally
finally
r - 自由変数はRのローカル変数の属性にどのように影響しますか?
関数を作成するコンストラクター関数があります。コンストラクターに対してローカルな「features」という名前の変数と、コンストラクターによって作成された関数に対してローカルな「features」という名前の別の変数があります。これらは、以下のコードで次のように区別されます。
1)## --> 'features' assignment 1 (see question)
features <- paramIN
2)## --> 'features' assignment 2 (see question)
features[!paramIN] <- p
3 つの観測;
1)features <- paramIN
返された関数の前に移動するfeatures[!paramIN] <- p
と、プログラムも機能します。paramIN
は返された関数内の自由変数であり、返された関数に対してfeatures
ローカルであり、サブセット化および代入される前にfeatures <- paramIN
宣言および初期化されるため、これは理にかなっています。features
2)返された関数features[!paramIN] <<- p
の外側の最初の宣言を使用して保持するとfeatures
、プログラムも機能し、さらに、features
返された関数が使用されると の最初のインスタンスが更新されます。この場合、返される関数に関する限り、features
との両方が自由変数です。返された関数の内部は、返された関数の外側で宣言されたものを参照してparamIN
いるようです。すべてが良いです。features
features
これが私の具体的な質問です:
3)しかしfeatures[!paramIN] <- p
、与えられたとおりに使用しても、完全に削除するfeatures <- paramIN
と、プログラムが見つからないため失敗しますfeatures
。最初の宣言 (返された関数の外側) はfeatures
、2 要素ベクトルとして確立する必要があるようです。しかし、「内側」features
は「外側」とは異なる変数features
です。features
返された関数に対してローカルであるため、返された関数の外側の宣言によってその存在と構造をどのように決定できますか?
javascript - Angular: 現在インスタンス化されているコントローラーを参照する
コントローラーの定義内から現在インスタンス化されているコントローラー オブジェクトへの参照を取得する方法はありますか? $compile
モーダルを作成し、それをモーダルを作成している同じコントローラーにバインドしたいと思います。
これは、私がやりたいことの簡略化されたバージョンです。ここで、THIS_CONTROLLER_INSTANCE
はコントローラー インスタンスへの参照です。
javascript - 約束を囲むforループでのレキシカルスコープ?
文字列をオブジェクトids
にマップするオブジェクトがあります。id
product
私はデータベースのやり取りにライブラリを使用しています。これは約束を公開します(then
上記の関数で示されています)。product
関数内の変数を出力しようとしていますthen
が、最後id
に取得してids
いるように見えるだけなので、スコープの問題のようです。各ループ関数product
で異なる製品を出力するように、変数を適切にスコープするにはどうすればよいですか?then