問題タブ [scala-quasiquotes]

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 に答える
393 参照

scala - scala quasiquotes: 型の比較

概要として、リフレクションを使用して Cassandra Java 行からケース クラスのコンストラクターを動的に作成し、ケース クラスのプライマリ コンストラクターを見つけてから、Cassandra 行から値を抽出しようとしています。

具体的には、ケース クラスの Option を行のオプション フィールドとしてサポートしたいと考えています。これにより、 case class Person(name: String, age: Option[Int]) 行に名前と年齢、または名前だけが含まれている (そして年齢に None を入力する) 場合に正常に入力されます。

この目的のために、Case Classes と Maps の間で同様の目的を達成するこの非常に役立つブログ投稿に従いました。

しかし、Case Class から反射的に型を抽出するという動的な性質と、準引用符のコンパイル時の性質を統合しようとして行き詰まっているようです。例として:

fieldTypeネイティブ型またはネイティブ型のオプションである可能性のある型があります。オプションの場合は、returnType.typeArgs.head準引用符の作成に渡し、パラメーター化された型を行から抽出できるようにします。オプションでない場合は、returnType だけを渡します。

if (fieldType <:< typeOf[Option[_]]) q"r.getAs[${returnType.typeArgs.head}]($fieldName)" else q"r.as[$returnType]($fieldName)"

(r が Cassandra Row でありasgetAsこの Row に存在すると仮定)

これをコンパイルしようとすると、実行方法がわからないというエラーが表示されますr.as[Option[String]]。ランタイム比較がどちらの方法で解決されるかをコンパイラーが知る方法がないため、両方のケースをチェックする必要があるため、これは私にとって概念的に理にかなっています。

では、この型チェックを行うにはどうすればよいでしょうか。タイプと準クォート内を比較できれば、文句を言うのをやめるかもしれませんが、準クォート内のタイプを比較する方法がわかりません。それが可能かどうかさえわかりませんfieldTypetypeOf[Option[_]]quasiquote 内の Option のパラメーター化された型を抽出できれば、文句を言わなくなるかもしれませんが、それもわかりませんでした。

申し訳ありませんが、私は Scala に非常に慣れていないため、現時点では、これは非常に混乱し、難解です。私がやっていることをもっと詳しく見たい場合は、https://github.com/thurstonsand/scala-cass/blob/master/src/main/scala/com/weather/scalacas/ScalaCass というリポジトリがあります。興味深い部分はScalaCass.CaseClassRealizer で、CaseClassUnitTests でテストしています。

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

scala - Scala quasiquote マクロの例が壊れている - 型シグネチャがオフ

この Scala quasiquote の例は、本「Programming Scala」(第 2 版)から引用しました。

このエラーが発生しています: https://issues.scala-lang.org/browse/SI-9711

型推論は「Trees#Tree」と言っていますが、型推論はオフです。

^ ドキュメントは自明であるべきです。型の推論では Tree#Tree と表示されますが、サンプル コードに ":Tree#Tree" を追加するとコンパイルが強制終了され、エラーが発生します。

IntelliJで「型の不一致、予想されるツリー、実際の Trees#Tree」が表示されます

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

scala - 新しい識別子を持つscalaマクロ

有用なものを返す可能性のあるブロックの実行にかかる時間を記録するために使用したいマクロがあります。したがって 、ログで関数の実行にかかった時間を取得するためにval y = f(x)変更するようなものがある場合。val y = Timed(f(x))

必要なものはほとんどありますが、名前の衝突を避けるために新しい用語名を使用すると、たとえば t0 と t1 の間でエラーが発生します。

これらの freshTermNames を準引用符で動作させるにはどうすればよいですか?

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

scala - Scalaの準引用符を使用して文字列変数を持ち上げる

これは私が直面している問題の単純化されたバージョンですが、根本的な問題は残っています。マクロを呼び出した後、ケース クラスを動的に生成したいと考えています。マクロ呼び出しなどからパラメーターを取得できます。問題は、準引用符内で文字列変数を使用しようとすることです。私は基本的に次のことを望んでいます:

ただし、ケース クラスは生成されません。toGen を q"case class Foo()" に変更すると機能することがわかりましたが、 toGen は、文字列を返す他の処理の後に生成する文字列であるため、それを行うことはできません。このようにコンパイルし、toReturn の値を手動で確認すると、次のようになります。

文字列 toGen は、引用符に沿って単純に貼り付けられます。つまり、ケース クラスは生成されません。

同様の問題を探しましたが、この例はどこにも見つかりません。準引用符内の文字列変数の二重引用符を外すにはどうすればよいですか?

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

scala - Scala「未解決のフリータイプが原因で反射ツールボックスが失敗しました」

初めて準引用符を試して、新しいケース クラスを一般的に生成します。

Produce.A() の結果:

私はAです

私は生きている

res0: A = 息子 ()

Produce[A]() の結果:

scala.tools.reflect.ToolBoxError: 未解決のフリー型変数が原因でリフレクション ツールボックスが失敗しました: :32:13 の apply によって定義された T 自由型変数の追跡に問題がある場合は、scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal の scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.verify(ToolBoxFactory.scala:82) で -Xlog-free-types を使用することを検討してください。 .compile(ToolBoxFactory.scala:208) at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$$anonfun$compile$2.apply(ToolBoxFactory.scala:429) at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$$anonfun$compile$2 .apply(ToolBoxFactory.scala:422) at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$withCompilerApi$.liftedTree2$1(ToolBoxFactory.scala:355) at scala.tools.reflect.

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

scala - 抽象フィールドを持つトレイトの依存性注入でクラスの新しいインスタンスを生成する Scala マクロ

更新: マクロ注釈を使用するようにコードを変更しましたが、まだ何かが欠けています

次のコードが機能します (以下の質問)。


以下を実行できるようにしたい:

私はこれをやろうとしました:

ただし、これは機能しません。

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

scala - 準引用符を使用した可変長の「選択」

Scala の quasiquotes を使用すると、次のように選択のツリーを簡単に構築できます。

私の質問は、(a、b、...、など)から選択するもののリストが可変長である場合(したがって、スプライスする必要がある変数内にある場合)、どうすればよいですか?

リフティングが機能することを望んでいました(たとえばtq"""..${List("a","b","MyObj")}"""、機能しません。または、これtq"""${List("a","b","MyObj").mkString(".")}"""でさえ、運がありません。

これを準引用符でサポートする方法はありますか? または、この場合、選択のツリーを手動で構築する必要がありますか?