問題タブ [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 - メソッド パラメータ名を scala マクロに保持する
私はインターフェースを持っています:
インターフェイスのメソッドを反復処理し、メソッド名とパラメーターを処理するマクロがあります。次のようにしてメソッド名にアクセスします。
doSomething
のパラメータの名前を出力すると、usefulName
になりx$1
ました。これはなぜですか? 元のパラメーター名を保持する方法はありますか?
私は scala バージョン 2.11.8、macros paradise バージョン 2.1.0、および blackbox コンテキストを使用しています。
インターフェイスは、実際には私が管理する別の sbt プロジェクトの Java ソースです。私はコンパイルしようとしました:
パラメータ フラグは名前を保持するはずですが、以前と同じ結果が得られます。
scala - Scala 注釈マクロは、事前定義されたクラスでのみ機能します
注:以下に編集があります! 注:下に別の編集があります!
私は、クラスに渡されてケース オブジェクトを作成する (またはむしろ入力する) Scala 注釈マクロを作成しました。ケース オブジェクトの名前は、渡されたクラスの名前と同じです。さらに重要なことは、渡されたクラスのすべてのフィールドに対して、同じ名前のケース オブジェクトにフィールドが存在することです。ただし、ケース オブジェクトのフィールドはすべて typeString
であり、それらの値は、渡されたクラスのそれぞれのフィールドの型の名前です。例:
ただし、これは、などの事前定義されたクラスでのみ機能するようString
です。a を定義してcase class A(...)
を実行しようとすると@RegisterClass(classOf[A]) case object A
、次のエラーが発生します。
私は何を間違えましたか?私のマクロのコードは以下にあります。また、一般的な Scala の慣用句や悪い慣習に誰かが気付いた場合、私はヒントを気にしません。事前にどうもありがとうございました!
編集: Eugene Burmako が指摘したようにclass A
、まだコンパイルされていないためにエラーが発生するため、java.lang.Class
for it が存在しません。私は今、これを機能させる方法を考えているすべての人のために、100 StackOverflow ポイントの報奨金を開始しました!
編集 2: ユースケースの背景: 学士論文の一部として、イベント処理システムのクエリを表現するための Scala DSL に取り組んでいます。これらのクエリは伝統的に文字列として表現されているため、多くの問題が発生します。典型的なクエリは次のようになります: 「select A.id, B.timestamp from pattern[A -> B]」。意味: のイベントがA
発生し、その後B
も同様のイベントが発生した場合はid
、そのイベントの とそのイベントA
のを教えてください。型と通常は、私が制御できない単純な Java クラスです。およびそれらのクラスのフィールドです。DSL のクエリを次のようにしたいと思います。これは、イベント タイプを表すすべてのクラスについて、たとえば、timestamp
B
A
B
id
timestamp
select (A.id, B.timestamp) { /* ... * / }
A
、理想的には同じ名前のコンパニオン オブジェクトが必要です。select
このコンパニオン オブジェクトは、次のようにフィールドを関数に渡すことができるように、それぞれのクラスと同じフィールドを持つ必要がありますselect (A.id, B.timestamp) { /* ... * / }
。A.idd
このように、関数に渡そうとするselect
と、元のクラスにそのようなフィールドがないとコンパイル時に失敗します。これは、コンパニオン オブジェクトにもフィールドがないためです。
scala - ユーザーが scalamacros パラダイスを含める最も簡単な方法
ライブラリにいくつかのマクロ注釈を追加しました。私のライブラリビルドには、
マクロパラダイスを有効にします。
マクロを使用する私のユーザーのプロジェクトでは、scalamacros
何らかの形でそれらも含める必要があることを知っています。現在、私のサンプル プロジェクトでは、上記と同じように実行しています。ユーザーがマクロを持ち込むための、より簡潔で複雑でない方法があるかどうか疑問に思っていましたか? たとえば、私がオフにすることができるいくつかの方法はありますcross CrossVersion.full
か? (ユーザーはおそらくクロスコンパイルしていないためです。)
java - Scala マクロが java.util.List、java.lang.Object を見つけられない
更新:この問題の解決策については、以下の回答を参照してください。2 番目の問題があります (マクロが Pojo を見つけられない)。2 番目の問題についての質問はこちら: Scala マクロが Java クラスを見つけられない
POJO からケース クラスを自動的に生成するための scala マクロを作成しています (avro での作業を少し楽にするため)。
コンパイラが java.util.List や java.lang.Object などの組み込みの Java クラスでチョークすることを除いて、すべてが「機能」します。
私の質問は、コンパイラが Java クラスを解決するようにマクロでコードを生成するにはどうすればよいですか?
エラー メッセージの例:
(Pojo.java の // コメントなし)
(図のように Pojo.java)
編集:showRawの結果
showRaw
次のような出力が得られますが、これは私には問題ないようです。
problemdemo/avroschemas/src/main/java/com/squarefoot/Pojo.java
:
problemdemo/src/main/scala/com/squarefoot/converters/problemdemo.scala
:
problemdemo/macros/src/main/scala/com/squarefoot/converters/Caseify.scala
:
Sbt ファイル:
problemdemo/build.sbt
problemdemo/macros/build.sbt
problemdemo/avroschemas/build.sbt
java - Scala マクロが Java クラスを見つけられない
POJO からケース クラスを自動的に生成するための scala マクロを作成しています (avro での作業を少し楽にするため)。
コンパイラが -マクロ展開中のみ- Java クラスをチョークすることを除いて、すべてが「機能」します。マクロの呼び出しをコメントアウトすると、すべて正常にコンパイルされます。
私の質問は、コンパイラが独自の Java クラスを解決するようにマクロでコードを生成するにはどうすればよいですか?
エラー メッセージの例:
problemdemo/avroschemas/src/main/java/com/squarefoot/Pojo.java
:
problemdemo/src/main/scala/com/squarefoot/converters/problemdemo.scala
:
problemdemo/macros/src/main/scala/com/squarefoot/converters/Caseify.scala
:
Sbt ファイル:
problemdemo/build.sbt
problemdemo/macros/build.sbt
problemdemo/avroschemas/build.sbt
scala - マクロ注釈 (インラインメタ) でシュガー、フォーマット、および空白を保持する方法は?
Scala 関数を外部形式にエクスポートしています。この目的のために、私は と を使用scala.meta
しStaticAnnotation
ます。何かのようなもの:
関数の本体の実装でExportFunctions extends StaticAnnotation
は、脱糖ツリーとして表されますx.max(y)
。
ただし、文書化の目的では、実際のソース コードがある方がはるかに優れています。または少なくとも砂糖(x max y
)。
元のフォーマット/砂糖を保存する方法はありますか?
scala - アノテーション マクロによって生成されたメソッドを参照すると、Scaladoc の生成が失敗する
私は 2 つのクラスを持っています。それらFoo
を と と呼びますFizz
。Foo
一部のメソッドのエイリアスを作成するために呼び出されるアノテーション マクロを使用expand
します (実際の実装はエイリアスの作成よりも少し多くのことを行いますが、単純なバージョンでは依然として次の問題が発生します)。簡単にするために、expand
マクロが単に注釈付きクラス内のすべてのメソッドを取得し、それらのコピーを作成し、メソッド名の末尾に「Copy」を追加してから、呼び出しを元のメソッドに転送するとします。
私の問題は、expand
マクロ onを使用するとFoo
、 というメソッドのコピーが作成され、が別のクラス内で呼び出されFoo#bar
たbarCopy
ときに、すべてがコンパイルされますが、scaladoc の生成は次のように失敗します。barCopy
Fizz
コピーされるメソッドにタグを付ける scaladoc を削除すると ( Foo#bar
)、sbt doc
コマンドは再び機能します。scaladoc ジェネレーターが、有効になっているマクロ パラダイス プラグインを使用せずにコンパイラの初期段階を呼び出しているかのようですが、問題のあるメソッドからドキュメントを削除すると、何らかの形で機能します。
これはexpand
マクロです:
そして、別のプロジェクトに存在するクラス:
これはバグか、おそらく欠落している機能のようですが、コピーされたメソッドからドキュメントを削除せずに上記のクラスの scaladoc を生成する方法はありますか? Scala 2.11.8 と 2.12.1 の両方でこれを試しました。これは、私が抱えている問題を示す単純な sbt プロジェクトです。