問題タブ [special-variables]
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
ボンネットの下のようなものを使用して、そうする方法を確認することです)。名前検索。特別であると明示的に宣言されていない限り、名前のルックアップは、バインディングの作成中に確立されたフレーム リンクを介して、レキシカル環境でのルックアップにデフォルト設定されます。検索プロセスで最初に一致した名前が勝ちます。特別な名前 (明示的に宣言する必要があります) の場合、ルックアップはスタックの一番上を調べることによって提供されます。
regex - perl の $^I に関するドキュメントはありますか?
$^I
条件付きで検索および置換するために、perl スクリプトで使用しました。$^I
バッファ内のファイルのコピーを作成し、バッファの処理後にバッファ全体をファイルに書き戻すか、行編集で行うかを知りたいです。
コードは次のとおりです。
regex - Perlで単一文字列の一致した正規表現の位置を見つけるにはどうすればよいですか?
たとえばmy $string = "XXXXXTPXXXXTPXXXXTP";
、match: を複数回実行し、それぞれの位置を返したい場合$string =~ /TP/;
、どうすればよいでしょうか?
を試しましたが$-[0]
、の位置しか得られません。$-[1]
$-[2]
$-[0]
編集:グローバル修飾子も試しましたが、//g
まだ機能しません。
ruby - ruby で __FILE__ == $PROGRAM_NAME とはどういう意味ですか?
Ruby でコードをレビューしているときに、この構文に出くわしました。コードは次のとおりです。
私__FILE__
がいるファイルの名前を取得する変数だと思いますか?しかし、何を象徴する$PROGRAM_NAME
のでしょうか?また、プログラムは if ステートメントの有無にかかわらず機能するため、この if ステートメントが必要なのはなぜですか?
string - bashで変数を別の変数内に置き換える
これは私のサンプルbashコードです:
ここで、特殊変数$@
は関数内の別の変数を参照します。コマンド_1、コマンド_2などの内容を表示するには、echo $nowが必要です。代わりに、出力を command_1、command_2 として出力するだけです。
eval を使ってみたのですが、 $i 部分の置換の設定方法がわかりません。if else ブロックを使用して関数内の各変数を一致させることもできますが、それはあまりにも不器用です。もっと良い方法はありますか?