問題タブ [scala-macro-paradise]
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 - シール型のすべてのサブタイプに暗黙を提供する
私のアプリケーションには、シールされたトレイト階層の一部である複数のケース クラスとオブジェクトがあります。Akka でメッセージとして使用します。
これらのクラスは、websocket 経由で送信する前に、ユーザー フレンドリな形式に変換する必要があります。
以前は大きなパターン マッチを使用してそれらを 1 か所で変換していましたが、型の数が増えるにつれて、暗黙的な変換を使用したいと考えています。
次のように使用したいと思います。
convert2
マクロを書かずに自動的に何かを生成する「魔法の」方法があるかどうか知りたいです。このようなマクロを提供するライブラリが既にあるのではないでしょうか?
scala - フィールドのツリーからクラス ツリーにアクセスする
ケースクラスを強化するマクロを書きたいと思います。ケースクラスを次のように宣言すると:
case class User(int id, @tagged name)
私は、Tree
注釈のみを持つこのクラスに何かを注入できるようにしたいと考えています。これまでのところ、囲んでいるクラスの にしか到達できSymbol
ませんでしたが、十分ではないようです (Eugene の回答はこちらを参照してください)。また、廃止予定の API も使用したくありませんc.enclosingClass
。ClassDef
パラダイス 2.1.0 (Scala 2.11) で親に到達する方法はありますか?
scala - astの用語名を置き換える簡単な方法
次のコードがあります。
このコードを使用して、次の使用例で変数名 ( ) を置き換えたいx
:
それは単純な方法ですが、多くの式を持つ大きな方法がある場合、変数名を置き換える最も簡単な方法は何ですか (たとえば、から) x
?y
scala - scala マクロから名前でクラス定義にアクセスする
単一のクラス引数を定義し、引数として提供されるクラスの実装に基づいてアタッチ先のクラスを変更する Scala マクロを作成しようとしています。
注釈から引数を抽出できる単純なマクロを作成することができました。その結果、完全なクラス名の文字列表現を含む TypeName オブジェクトが生成されます。
問題は、マクロの実装から A の定義にアクセスする必要があることです (具体的には、コンストラクターの引数が何であるかを確認したい)。
何らかの方法で TypeTag[A] にアクセス/作成する方法はありますか? クラス A の AST にアクセスする方法はありますか?
私が達成しようとしていることを説明するために、これは私が現在マクロ定義として持っているものです:
scala - import ステートメントを含む scala マクロが機能しない
次のような特性に注釈を付けています。
そして、次のような @ScreenModel の実装を取得しました。
だから、それで私は得る:
「コンパニオンのない最上位クラスは、同名のクラスまたはブロックにのみ展開できます」
しかし、AAA クラス内の AAA クラスの直前にインポートを移動すると、次のように機能します。
なんで?
scala - デフォルト引数によるマクロ注釈
Scala マクロ アノテーションからパラメーターを取得するでは、マクロ アノテーションからパラメーターを取得する方法について説明します。ただし、デフォルト値を持ついくつかのパラメーターがある場合:
私は書く必要があります(その質問への答えに基づいて)
のロジックは???
非常に厄介になっているようです。位置パラメータと名前付きパラメータの両方を処理する必要があり、デフォルト値への単純なアクセスはありません。単純化する方法はありますか?
scala - Scala マクロ アノテーションの展開順序
クラスが最初に変換される (および変更可能に@AnotherMacro
なる) か、それともメソッドが変換されるか? これは保証されていますか?
scala - メソッドでマクロ注釈を展開するときに、囲んでいるクラスのフィールドの型を見つける
ロギングを扱うマクロ注釈があり、SLF4J と Log4j2 の両方のロギングを処理したいと考えています。残念ながら、これにはlogger
フィールドのタイプを見つける必要があります。注釈が他の質問のクラスにある場合、これを行う方法を知っています。しかし、アノテーションがメソッドにある場合はわかりません。これは私が試したことです:
これはコンパイルされますenclosingClass
が (推奨されません)、この注釈を使用してクラスをコンパイルすると、illegal cyclic reference
. 囲んでいるクラス全体の型チェックも機能しません。
それを行う方法はありますか?