問題タブ [free-variable]
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.
clojure - Clojure 関数に影響を与える Var はどれですか?
Clojure で定義された関数の結果に影響を与える可能性がある Vars をプログラムで特定するにはどうすればよいですか?
次の Clojure 関数の定義を考えてみましょう。
これは の関数ですがx
、*increment*
(またclojure.core/+
(1)の関数でもあります。しかし、私はそれについてあまり関心がありません)。この関数のテストを作成するときは、関連するすべての入力を確実に制御したいので、次のようにします。
(誰かが合理的に変更する可能性のある構成値であると想像してください*increment*
。これが発生したときに、この関数のテストを変更する必要はありません。)
(f 1)
私の質問は次のとおりです: の値が依存する可能性がある*increment*
が他の Var には依存しないというアサーションをどのように記述すればよいですか? いつか誰かがコードをリファクタリングして関数を
テストを更新することを怠り、ゼロであってもテストを失敗させたいと思い*additional-increment*
ます。
もちろん、これは単純化された例です。大規模なシステムでは、多数の動的 Var が存在する可能性があり、それらは関数呼び出しの長いチェーンを通じて参照される可能性があります。Var を参照するf
呼び出しg
が呼び出された場合でも、ソリューションは機能する必要があります。に依存してh
いると主張しないのは素晴らしいことですが、これはそれほど重要ではありません。分析対象のコードがJava 相互運用機能を呼び出したり使用したりしている場合、もちろんすべての賭けは外れます。(with-out-str (prn "foo"))
*out*
eval
ソリューションの 3 つのカテゴリを考えることができます。
コンパイラから情報を取得する
存在しない Var を参照しようとすると、次のようにスローされるため、コンパイラは関数定義をスキャンして必要な情報を取得すると思います。
これは、問題のあるコードが実行されるかどうかに関係なく、コンパイル時に発生することに注意してください。したがって、コンパイラは、関数によって参照される可能性のある Vars を認識している必要があり、その情報にアクセスしたいと考えています。
ソース コードを解析して構文ツリーをたどり、Var がいつ参照されたかを記録する
コードはデータであり、そのすべてだからです。
macroexpand
これは、各 Clojure プリミティブとそれらが使用するあらゆる種類の構文を呼び出して処理することを意味すると思います。これはコンパイル フェーズに非常によく似ているため、コンパイラの一部を呼び出したり、独自のフックをコンパイラに追加したりできれば素晴らしいと思います。Var メカニズムを計測し、テストを実行して、どの Var がアクセスされるかを確認します。
他の方法ほど完全ではありませんが (私のテストが失敗したコードのブランチで Var が使用されている場合はどうなるでしょうか?)、これで十分です。
def
Var のように動作するが、何らかの方法でそのアクセスを記録するものを作成するには、再定義する必要があると思います。
(1)実際には、再バインドしてもその特定の機能は変わりません+
。しかし、Clojure 1.2 では、最適化を行うことでその最適化をバイパスでき、それ(defn f [x] (+ x 0 *increment*))
から を楽しむことができます(binding [+ -] (f 3))
。Clojure 1.3 では、再バインドを試みると+
エラーがスローされます。
coq - Coqの自由変数
Coqを使用して、自由変数、たとえばn:Uが項/式eに存在するかどうかを取得/チェックする関数/コマンドはありますか? 共有してください。
たとえば、この「n は e の自由名には現れない」と Coq で述べたいと思います。
ありがとう、
ウィラヤット
el - EL式の自由変数をリストする
プログラム構成に使用されるEL評価を含むアプリケーションがあります。EL式が与えられた場合、実際に評価せずに、それに含まれる自由変数を取得したいと思います。目的は、エンドユーザーが「評価」ボタンを押す前に値を自由変数にバインドできるUIを提供することです。
残念ながらjavax.el.ValueExpression
、この機能は提供されていないため、ベンダー固有のAPIを使用する必要がある場合があります。開発のかなり早い段階なので、実装の選択はまだ修正していません。私はMVEL、JUEL、SpELについて考えましたが、もちろん、私が選択したものはすべて、上記で説明した機能を備えている必要があります。
ocaml - ラムダ式の自由変数リスト
私は次のOCamlテストのために宿題をしていましたが、何の問題もありませんでした。
次の抽象構文(xは変数)で定義されたλ項の言語を考えてみましょう。
λ項を表す型項を記述します。変数が文字列として表されていると仮定します。
わかりました、男の子。
項tの自由変数fv(t)は、帰納的に次のように定義されます。
確実なこと。
例えば、
それを確認しましょう。
私は何百万回もチェックしましたが、結果には「z」変数が含まれているはずです。それについて私を安心させていただけませんか?
haskell - 純粋関数は自由変数を持つことができますか?
たとえば、自由変数のない参照透過関数:
は、( の観点からf
) 自由な変数op
と を持つ関数になりましたx
:
f
参照透過性もあります。しかし、それは純関数ですか?
純粋な関数ではない場合、参照透過的であるが、外側のスコープにバインドされた 1 つ以上の変数を使用する関数の名前は何ですか?
この質問の動機:
ウィキペディアの記事からはわかりません:
結果値は、すべて (またはいずれか) の引数値に依存する必要はありません。ただし、引数の値以外に依存する必要はありません。
(私のものを強調)
また、 Google検索からも、純粋な関数が自由な (関数のスコープにバインドされていないという意味で) 自由な変数に依存できるかどうかはわかりません。
また、この本には次のように書かれています。
自由変数のない関数が純粋なら、クロージャーは不純ですか?
関数
function (y) { return x }
は面白いです。これには、自由変数 x が含まれます。自由変数は、関数内でバインドされていない変数です。これまで、変数を「バインド」する方法は 1 つしか見てきませんでした。つまり、同じ名前の引数を渡すことです。関数function (y) { return x }
には x という名前の引数がないため、変数 x はこの関数にバインドされず、「フリー」になります。</p>関数で使用される変数が束縛されているか自由であるかがわかったので、関数を自由変数を持つものと持たないものに分けることができます。
- 自由変数を含まない関数は純粋関数と呼ばれます。
- 1 つ以上の自由変数を含む関数はクロージャと呼ばれます。
では、「純粋関数」の定義は何ですか?
python - 「NameError: 囲んでいるスコープで代入する前に参照される自由変数 'var'」は実際のコードでどのように発生しますか?
私がPython チャットルームでぶらぶらしていたときに、誰かが立ち寄って次の例外を報告しました。
私は以前にそのエラーメッセージを見たことがなく、ユーザーが提供したのは小さなコードフラグメントだけであり、それ自体がエラーを引き起こした可能性はありませんでした。 . 私が検索している間、ユーザーは問題が解決したことを「空白の問題」として報告し、部屋を出ました。
少し遊んだ後、次のようなおもちゃのコードでのみ例外を再現できました。
それは私に与えます:
すべて順調ですが、上記の例が
- かなりばか
- 偶然に起こる可能性は低い
...しかし、この質問の冒頭で述べたレポートを考えると、明らかにそうです。
では、この特定の例外が実際のコードでどのように発生するのでしょうか?