問題タブ [callbyname]

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.

0 投票する
2 に答える
1822 参照

haskell - ラムダ計算の値渡しインタープリターと名前渡しインタープリターの違い

別の質問で、Bobは型指定されていないラムダ計算の次のインタープリターを提示しました。

Ivan Zakharyaschev は、このインタプリタは値による呼び出しであると述べましたF f -> f (interpret env e2)call-by-name インタープリターの実装は、上記のものとどのように異なるでしょうか?

Plotkinは、1970 年代にラムダ計算を評価するための名前による呼び出しと値による呼び出しの戦略を研究しました。

0 投票する
3 に答える
545 参照

scala - 名前による呼び出しパラメーターが () => Int ではなく Int 型のパラメーターを期待する理由

Scala で名前による呼び出しパラメーターを使用することについて少し混乱しています。ここで何が起こっているのかを理解するのを手伝ってください。call-by-name パラメーターを使用する次の例を検討してください。

これについて互いに関連するいくつかの質問があります。

  1. lazyEvalメソッドは type のパラメーターを期待する=> Intのに、なぜparam + 2操作が合法なのですか? メソッドを呼び出すときに=> Int、型を持つオブジェクトに整数 2 を追加できるのはなぜですか? IDEが私に示唆しているように、関数は(一体何?)の代わりに型のパラメータを期待しています。<function0>lazyEvallazyEvalInt=> Int

  2. コールバック タイプを=> Intから() => Intコードに変更した後、コンパイルされないのはなぜですか? これは2種類の違いですか?短いバージョン ('=> Int') は単なる構文糖衣だと思います。

  3. コードでいくつか遊んだ後、最終的にコードを変更して、でコンパイルできるようにしました() => Int。この方法は私にとってより直感的です。

.

=> Intこのバージョンと最初のバージョン (コールバックタイプあり)の違いは何ですか? 2このバージョンでは、値とparam関数 (つまり this lazyEval(param _ + 2))を使用して整数を加算できないのはなぜですか? そして、メソッド名の後のアンダースコアはどういう意味ですか? (戻り値ではなく、メソッド自体を渡すために使用されていたと思います)

助けてくれてありがとう

0 投票する
1 に答える
417 参照

scala - Scala マクロでの名前によるパラメーターの処理

ネストされた関数のアプリケーションを分析するマクロがあります。アプリケーションを照合し、次の方法でパラメータ タイプを取得します。

ここで、たまたま名前付きパラメーターがある場合、出力=> Tされるが何にも一致しない奇妙な型が得られます。リフレクション API には、これらを適切に処理する機能がないようです。私がやりたいのは、生成されたコードでさらに問題が発生するため、Tそれが の場合に取得することです。=> T=> T

0 投票する
2 に答える
73 参照

scala - 値による & scala の名前による => 1 対 1 の対応

渡しの場合

val f: (Int) => Int = {(i) => {i * i}} # f: Int => Int = <function1>
の省略形です
val f: Function1[Int, Int] = {(i) => {i * i}} # f: Int => Int = <function1>

次に、名前 で呼び出す場合は?
val f: (=> Int) => Int = {(i) => {i * i}} # f: (=> Int) => Int = <function1>
の省略形です 。
何 ?

で、もし

値による呼び出し時

val f = {(i) => {i * i}}:(Int) => Int # f: Int => Int = <function1>
の省略形です
val f = {(i) => {i * i}}:Function1[Int, Int] # f: Int => Int = <function1>

次に、名前 で呼び出す場合は?
val f = {(i) => {i * i}}:(=>Int) => Int # f: (=> Int) => Int = <function1>
の省略形です 。
何 ?

言い換えると

if (Int) => IntFunction1[Int, Int]の短縮形です

then (=> Int) => Int?の省略形です。何 ?

ありがとうございました !

0 投票する
1 に答える
541 参照

scala - Scala:名前による呼び出し変数をクラスフィールドとして保存

Scala 学習の進行状況で、コールバックを使用して単純な DSL を実装しようとしています。

新しいオブジェクトを作成し、ストアへのコールバックを渡します。私のデモフレームワークはonClick、保存されたものを呼び出す必要があるメソッドを起動します

それは動作し() => Unitますが、私のDSLは醜く見えます:

onClick確かに、後で匿名クラスを抽象化して実装できます

しかし、DSLなどで遊びたい

質問は次のとおりです。

  • fに保存するにはどうすればよい_click_cbですか?
  • に初期の「空」関数を提供するにはどうすればよい_click_cbですか?
  • そして、これを達成するためのより多くのスカラウェイがあるでしょうか? (匿名クラスなし)
0 投票する
3 に答える
303 参照

scala - 動的に変化する関数 scala

私はscalaを学んでおり、次のコードに出くわしました。

出力は 10 対 1 の数字です。

したがって、cond と body はどちらも「名前による呼び出し」パラメーターです。つまり、関数で使用されたときに評価されます。私がそれを正しく理解していれば。私が理解していないのは、体がどのように

適用される再帰の各レベルごとに変化し、変数 i が変化するにつれて本体が変化します。しかし、それはどのように正確に機能しますか?同じ関数本体が渡されるたびに、この関数は同じままですが、プログラムを実行すると、そうでないことがわかります。関数が毎回評価されることは知っていますが、内部の i 変数が毎回どのように変化するのか理解できないので、誰かがそれがどのように機能するか説明できますか?