問題タブ [scala-macros]
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.
scala - scala マクロでの LabelDef の使用 (2.10)
scala 2.10 マクロ機能を試しています。ただし、場合によっては、LabelDefの使用に問題があります。コンパイラのコードをある程度のぞき見したり、Miguel Garcia の論文の抜粋を読んだりしましたが、まだ行き詰まっています。
私の理解が正しければ、疑似定義は次のようになります:
LabelDef(labelName, listOfParameters, stmsAndApply)
3 つの引数は Trees であり、
-は定義されているラベル$LlabelName
の識別子です- $L(a1のように、label
- applyが発生したときに渡される引数に対応します,...,an)、および空にすることができます
-ステートメントのブロック(おそらくなし) に対応し、最後のapply -expression
label-apply は多かれ少なかれラベルへの GOTO を意味しますlistOfParameters
stmsAndApply
たとえば、単純なループの場合、LabelDef は最終的にそれ自体を適用できます。
LabelDef($L, (), {...; $L()})
ここで、互いにジャンプする 2 つの LabelDef を定義する場合:
2 番目の LabelDef は問題ありませんが、コンパイラは 1 番目に "not found: value $L2 " というエラーを出力します。これは、適用しようとしているときに$L2がまだ定義されていないためだと思います。これは構築中のツリーなので、私には意味があります。これまでの私の理解は正しいですか?エラーが予想されない場合、それは私のマクロ実装におそらくバグがあることを意味するためです。
とにかく、何らかの方法で$L1 から $L2 を適用する (つまり、$L2 にジャンプする) 方法が必要だと思いますが、その方法がわかりません。誰かがそれを行う例、またはポインタを持っていますか?
マクロでの LabelDef の使用に関するその他の不明確な点 (ただし、現在はそれほど懸念されていません) は次
のとおりです。つまり、パラメーターを使用したラベル適用のメカニズムは何ですか?
- 3 番目の引数の最終式に label-apply 以外のものを入れることは有効ですか? (試すことができないわけではありませんが、マクロはまだ実験
段階です) -LabelDef の外で転送ラベル適用を実行することは可能ですか? (これは冗長な質問かもしれません)
もちろん、答えの中のマクロの実装例は大歓迎です!
乾杯、
scala - マクロでクロージャーボイラープレートを非表示にしますか?
クロージャの例を考えると、この場合、文字列内の単語数が返されます (任意の演算子が追加されています)。
ボイラープレートの一部を非表示にして、次のように書く方法はありますか:
macros - returntype が引数に依存する scala マクロを書くことは可能ですか?
DSL の場合、次のようなことができるようにしたいと考えています。
私の問題は、Any
in reify を、正しくパラメータ化されたバージョンを返すものに置き換えることです。
(上記では文字列引数を使用していますが、最終バージョンでは、クラス T のコンパニオン オブジェクトをマーカーとして使用して、Function1[T,Unit] の引数の型を知る予定です)
scala - Scala:パス依存型の同等性
同じであることがわかっているがコンパイラがそうではない2つのパス依存型の同等性を回避するにはどうすればよいですか?
Scala 2.10.0 M7を使用して、ASTをあるユニバースから別のユニバースに変換しようとしています。
マクロ実装内では、次のように使用できます。
ただし、これによりコンパイラエラーが発生します。
上記のコードc
では、明らかにと同じ値ですがbridge.context
、値型チェッカーがチェックできないためかもしれません。一般化された型制約を置くことは役に立ちませんでした:
マクロでは、これでもエラーが発生しました。
context.universe
のような他の依存型にアクセスできるように、へのアクセスが必要TermName
です。キャスト以外にもっと良い回避策はありますか?:
scala - Scala マクロで「this」を囲むことをどのように参照すればよいですか?
より大きな例から抽出された次のマクロは、への参照だけでツリーを作成することになっていますthis
。
しかし、次のようechoThis
な呼び出し
コンパイルに失敗し、メッセージが表示されます
-Ymacro-debug-liteフラグを設定すると、生成されるツリーはThis(newTermName("<local Testing>"))
.
scala - マクロ、スプライス、およびパターン マッチング
パターンマッチでマクロへの引数を使用する方法はありますか? 私はこれをしたいと思います:
しかし残念ながら、コンパイラは「安定した識別子が必要ですが、X.splice が見つかりました」と言っています。通常、次のように最初に val に代入することでこれを解決します。
もちろん、それはスプライスでも機能しません。
scala - Scala でメソッドを独立した関数に抽出する
次のようなものが与えられます:
関数を (自動的に) 抽出する方法:
この正確な型シグネチャ (最初にオブジェクト、次にパラメーター リスト) を使用します。問題を非常に明確に述べさせてください。
f(x1: X1, ..., xn: Xn)
「クラス のコンテキストで定義されたメソッドが与えられた場合A
f'
、 (i) 型のインスタンスを受け取り、(a
A
ii)のパラメーター リストに 1:1 で対応するパラメーター リスト、つまりを受け取る関数を自動的に抽出する方法。実装はまさに「f
x1: X, ... xn: Xn
a.f(x1: X1, ..., xn: Xn)
あるいは:
ラムダ計算の拡張性の概念を捉えて 、.
λx.(f x)
f
x
f
f
これは、識別子、g
、 ... にアクセスする方法を見つけることによって最初に取り組むことができa: A
ますA
。単純に書くことf'
もg'
手で書くこともできますが、DRYness を楽しみましょう。
PS たぶん、これは実行時リフレクションなしでは不可能です (Scala 2.10f
以降のマクロでは可能かもしれませんが)。ただし、に頼る必要なしに、次のようなものになります。g
a: A
strings
また、質問を実際に使用すると、参加者が代替案を提案するのに役立つ可能性があることも理解していますが、これについては抽象的な意味で議論しています. 私はこの問題に縮小した他の問題を解決しようとはしていません。これが可能かどうかを知りたいと思っています:-)この質問の背後にある動機を実際に理解するための非常に素晴らしい記事です。
scala - Scala: ボイラープレートのない pimping
Pimp my Libraryパターンを多用しており、ボイラープレートを削除したいと考えています。たとえば、PrettyPrint というトレイトがあるとします。
Int と Double をポン引きしたい場合は、次のようなコードを書く必要があります。
上記では、ボイラープレートとして分類します: 1) 暗黙的な変換の名前、2) "new" キーワード、3) おそらく引数名 "self"、4) おそらく "implicit" キーワード。私はむしろこのようなものを書きたい:
上記のコードの右側では、「self」という名前が変換引数であると想定されています。
これを行う方法についてのアイデアはありますか?
いくつかのメモ:
1) 必要に応じて Scala 2.10 を使用します。
2)私の知る限り、Scala 2.10 の新しい暗黙のクラスは十分ではありません。これは、暗黙的なクラスごとに暗黙的な変換が 1 つしかないためです。つまり、PrettyPrint が 2 回宣言されているため、次のようなコードはコンパイルされません。
scala - Scala マクロを使用したメソッド呼び出しで名前付きパラメーターをモデル化する方法は?
共通の特定の値を持つ一連のケース クラスのケース クラスのインスタンスであるオブジェクトのコピーを作成すると便利なユース ケースがあります。
たとえば、次のケース クラスを考えてみましょう。
次にcopy
、これらのケース クラス インスタンスのそれぞれで呼び出すことができます。
hereおよびhereで説明されているように、これを次のように抽象化する簡単な方法はありません。
そこで、この仕事を (ほぼ) 行う scala マクロを作成しました。
(上記のコード ブロックの下部を参照)の最後の引数はApply
、パラメーターのリストです (ここでは、メソッド 'copy' のパラメーター)。id
新しいマクロ API を使用して、指定された型c.Expr[Option[Int]]
を名前付きパラメーターとして copy メソッドに渡すにはどうすればよいですか?
特に、次のマクロ式
結果として
以下が成立するように
欠落している部分は、プレースホルダーによって示され/*?id?*/
ます。
scala - マクロは、Scala で自然にチェーンされた比較を可能にしますか?
Scala は、Python のように連鎖比較を提供しません。
新しいマクロ機能を備えた Scala 2.10 により、プログラマはこの機能を追加するライブラリを作成できますか? それとも、これはScala のマクロの範囲を超えていますか?
マクロは、パーサー/コンパイラーを複雑にしないため、このようなシンタックス シュガーの実装に適しているようです。