問題タブ [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.

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

scala - メソッド パラメータ名を scala マクロに保持する

私はインターフェースを持っています:

インターフェイスのメソッドを反復処理し、メソッド名とパラメーターを処理するマクロがあります。次のようにしてメソッド名にアクセスします。

doSomethingのパラメータの名前を出力すると、usefulNameになりx$1ました。これはなぜですか? 元のパラメーター名を保持する方法はありますか?

私は scala バージョン 2.11.8、macros paradise バージョン 2.1.0、および blackbox コンテキストを使用しています。

インターフェイスは、実際には私が管理する別の sbt プロジェクトの Java ソースです。私はコンパイルしようとしました:

パラメータ フラグは名前を保持するはずですが、以前と同じ結果が得られます。

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

scala - Scala 注釈マクロは、事前定義されたクラスでのみ機能します

注:以下に編集があります! 注:下に別の編集があります!

私は、クラスに渡されてケース オブジェクトを作成する (またはむしろ入力する) Scala 注釈マクロを作成しました。ケース オブジェクトの名前は、渡されたクラスの名前と同じです。さらに重要なことは、渡されたクラスのすべてのフィールドに対して、同じ名前のケース オブジェクトにフィールドが存在することです。ただし、ケース オブジェクトのフィールドはすべて typeStringであり、それらの値は、渡されたクラスのそれぞれのフィールドの型の名前です。例:

ただし、これは、などの事前定義されたクラスでのみ機能するようStringです。a を定義してcase class A(...)を実行しようとすると@RegisterClass(classOf[A]) case object A、次のエラーが発生します。

私は何を間違えましたか?私のマクロのコードは以下にあります。また、一般的な Scala の慣用句や悪い慣習に誰かが気付いた場合、私はヒントを気にしません。事前にどうもありがとうございました!

編集: Eugene Burmako が指摘したようにclass A、まだコンパイルされていないためにエラーが発生するため、java.lang.Classfor it が存在しません。私は今、これを機能させる方法を考えているすべての人のために、100 StackOverflow ポイントの報奨金を開始しました!

編集 2: ユースケースの背景: 学士論文の一部として、イベント処理システムのクエリを表現するための Scala DSL に取り組んでいます。これらのクエリは伝統的に文字列として表現されているため、多くの問題が発生します。典型的なクエリは次のようになります: 「select A.id, B.timestamp from pattern[A -> B]」。意味: のイベントがA発生し、その後Bも同様のイベントが発生した場合はid、そのイベントの とそのイベントAのを教えてください。型と通常は、私が制御できない単純な Java クラスです。およびそれらのクラスのフィールドです。DSL のクエリを次のようにしたいと思います。これは、イベント タイプを表すすべてのクラスについて、たとえば、timestampBABidtimestampselect (A.id, B.timestamp) { /* ... * / }A、理想的には同じ名前のコンパニオン オブジェクトが必要です。selectこのコンパニオン オブジェクトは、次のようにフィールドを関数に渡すことができるように、それぞれのクラスと同じフィールドを持つ必要がありますselect (A.id, B.timestamp) { /* ... * / }A.iddこのように、関数に渡そうとするselectと、元のクラスにそのようなフィールドがないとコンパイル時に失敗します。これは、コンパニオン オブジェクトにもフィールドがないためです。

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

scala - ユーザーが scalamacros パラダイスを含める最も簡単な方法

ライブラリにいくつかのマクロ注釈を追加しました。私のライブラリビルドには、

マクロパラダイスを有効にします。

マクロを使用する私のユーザーのプロジェクトでは、scalamacros何らかの形でそれらも含める必要があることを知っています。現在、私のサンプル プロジェクトでは、上記と同じように実行しています。ユーザーがマクロを持ち込むための、より簡潔で複雑でない方法があるかどうか疑問に思っていましたか? たとえば、私がオフにすることができるいくつかの方法はありますcross CrossVersion.fullか? (ユーザーはおそらくクロスコンパイルしていないためです。)

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

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

0 投票する
0 に答える
226 参照

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

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

scala - マクロ注釈 (インラインメタ) でシュガー、フォーマット、および空白を保持する方法は?

Scala 関数を外部形式にエクスポートしています。この目的のために、私は と を使用scala.metaStaticAnnotationます。何かのようなもの:

関数の本体の実装でExportFunctions extends StaticAnnotationは、脱糖ツリーとして表されますx.max(y)

ただし、文書化の目的では、実際のソース コードがある方がはるかに優れています。または少なくとも砂糖(x max y)。

元のフォーマット/砂糖を保存する方法はありますか?

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

scala - アノテーション マクロによって生成されたメソッドを参照すると、Scaladoc の生成が失敗する

私は 2 つのクラスを持っています。それらFooを と と呼びますFizzFoo一部のメソッドのエイリアスを作成するために呼び出されるアノテーション マクロを使用expandします (実際の実装はエイリアスの作成よりも少し多くのことを行いますが、単純なバージョンでは依然として次の問題が発生します)。簡単にするために、expandマクロが単に注釈付きクラス内のすべてのメソッドを取得し、それらのコピーを作成し、メソッド名の末尾に「Copy」を追加してから、呼び出しを元のメソッドに転送するとします。

私の問題は、expandマクロ onを使用するとFoo、 というメソッドのコピーが作成され、が別のクラス内で呼び出されFoo#barbarCopyときに、すべてがコンパイルされますが、scaladoc の生成は次のように失敗します。barCopyFizz

コピーされるメソッドにタグを付ける scaladoc を削除すると ( Foo#bar)、sbt docコマンドは再び機能します。scaladoc ジェネレーターが、有効になっているマクロ パラダイス プラグインを使用せずにコンパイラの初期段階を呼び出しているかのようですが、問題のあるメソッドからドキュメントを削除すると、何らかの形で機能します。

これはexpandマクロです:

そして、別のプロジェクトに存在するクラス:

これはバグか、おそらく欠落している機能のようですが、コピーされたメソッドからドキュメントを削除せずに上記のクラスの scaladoc を生成する方法はありますか? Scala 2.11.8 と 2.12.1 の両方でこれを試しました。これは、私が抱えている問題を示す単純な sbt プロジェクトです。