問題タブ [scala-compiler]
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 コンパイラ プラグイン開発のベスト プラクティス
コンパイラ プラグインのコードを反復処理して、( 経由でpublishLocal
) コンパイルするたびにコンパイラ プラグインをローカルのアイビー リポジトリに公開し、このプラグインへの依存関係が 経由で定義されている他のプロジェクトを実行していますaddCompilerPlugin
。コンパイラ プラグインを開発するためのより簡潔な方法はありますか?
もちろん、この 2 つをマルチプロジェクト ビルド定義に集約することもできます。しかし、プラグインコードを反復するためのより軽量なプラクティスを学ぶのは良いことかもしれません...
そのためのライブラリに変換せずに、少なくともコンパイラプラグインに依存できますか? 許可されている構文から、addCompilerPlugin
単なるクラス ファイルに依存するのではなく、ライブラリを作成して追加する必要があるように見えます (?)。
scala - インライン関数をオーバーライドすることは可能ですか?
私は、関数がオーバーライドされた後、Scala コンパイラが関数をインライン化すると想定しています。
scala - 不変性のための Scala コンパイラーの最適化
val
ブロック内で一度だけ使用される sへの参照を削除することにより、scala コンパイラはメモリ使用量を最適化しますか?
巨大なデータを集約して保持しているオブジェクトを想像してみてください。データまたはその派生物を複製すると、JVM/マシンのメモリの最大量をスクラッチする可能性があるサイズに達します。
最小限のコード例ですが、より長い一連のデータ変換を想像してください。
コンパイラは、たとえば、計算huge
後にガベージ コレクションの対象としてマークしたままにしますか? derivative1
それとも、ラッピングブロックが終了するまで生き続けますか?
不変性は理論的には素晴らしいものです。個人的には中毒性があると思います。しかし、現在のオペレーティング システムでアイテムごとにストリーム処理できないビッグ データ オブジェクトに適合させるためには、JVM でのビッグ データ アプリケーションの場合、合理的なメモリ使用率と本質的にインピーダンスのミスマッチであると主張します。コンパイラがこのようなことを最適化しない限り、そうではありません..
java - InvocationTargetException. クラス X をクラス X にキャストできません。Scala Imain で spark-submit を介して呼び出された場合
したがって、次のユースケースがあります。
DSL のようなインターフェイスを提供することで、特定のドメインでの Spark データフレームの使用を簡素化しています。このコードはすべて、Maven シェード プラグインによって作成されたファット jar に入れられます。(fat jar = spark と hadoop の依存関係なし)
このファット jar にはメイン クラスがあり、それを JavaMain と呼びましょう。
JavaMain 内で、残りの呼び出しを行って、内容が有効な DSL である文字列を取得します。
初期設定オブジェクトを使用して IMain オブジェクトをインスタンス化します。そして、いくつかの変数をバインドします。imain.bind メソッドを使用します。
ただし、このバインドは次のエラーで失敗します。
詳細なコンテキスト:
これを試してみると、クラスパスに問題がありました。私はそれらすべてを解決できていないようですが。
以前に設定オブジェクトを作成したとき、私は次のようなことをしていました:
ただし、spark サブミットを実行すると、クラスパスに spark および hadoop 関連の jar しかないため、これは機能していないように見えました。
次に、クラスパスに次を追加しました。
そして、次のことを行いました:
これは、オブジェクトをバインドするために使用しているコードです。
これにより、先ほど添付した例外がスローされます。興味深いことに、次のコードが機能します: (つまり、Interpreter 内の同じオブジェクトの import と new は問題を引き起こしません)。
私が知っていて気になっているもう 1 つの詳細は、IMain がクラスローダーを内部的に変更することです。それが問題の原因であるかどうかはわかりません。
どんな助けでも大歓迎です。
scala - 非インタラクティブな scala.tools.nsc.Global を使用してファイルを AST に解析する
にscala.tools.nsc.interactive.Global
は、parseTree
方法があります。代わりにを使用して、ファイルから AST を取得したいと思いますscala.tools.nsc.Global
。定義を見てparseTree
、私は書きました
しかし、これは生成します
コンパイラを正しく初期化するには? Scala バージョン 2.11.7。
shapeless - Functor がパラメーター インスタンスの暗黙的な値を欠いている (sbt clean 後のみ)
Kittens ( https://github.com/milesabin/kittens ) でいくつかの実験を行ったところ、コードのコンパイルに問題がありました。次のエラーが表示されます。
完全なファイルは次のとおりです
問題なくコンパイルされる ScalaTest でほぼ同じコードを使用しました。
私のbuild.sbtは次のようになります name := "shapeless-experiments"
最も興味深いのは、インクリメンタル コンパイルの一部としてコンパイルされることです。
行番号 16、23、32 にコメントを付けてから「sbt compile」を実行し、コメントを削除して「sbt compile/package」を実行すると、コンパイルされ、プログラムを実行することさえできます。しかし、「sbt clean」を実行するとすぐにコンパイルされなくなります。
AdtDefns Object は基本的にhttps://github.com/milessabin/kittens/blob/master/core/src/test/scala/cats/derived/adtdefns.scala のコピーです 該当部分は
PS: 誰かが scala-kittens のタグを作成できるといいですね
scala - Scalaでは、「推論された型引数が準拠していません」エラーを回避する方法は?
暗黙の TypeTag パラメータを持つ反射関数があります。
不明な理由で機能しないもの (ジェネリック型パラメーターを検出するのに十分強力な Scala 型推論を作成する方法を参照してください):
Option[R] から R を推論したことが原因だと推測するので、少し改善します。
今回はさらに悪いことに、コンパイルさえしません。このエラーは、scala が型を分析するほどスマートではないことを明確に推測しています。
では、このコンパイルの問題を一時的に回避するにはどうすればよいでしょうか? (もちろん、Lightbend issue tracker で報告できますが、遅すぎます)
補遺: この問題自体は、ジェネリック型パラメーターを検出するのに十分なほど強力な Scala 型推論を行うには? 、修正されない可能性があります。私の場合、タイプ R または Option[R] の TypeTag を取得してもかまいません。
scala - scalac -Xlint の正しい使い方
scalax -Xlint のヘルプには、次の情報が記載されています。
すべてのチェックを有効にする方法はありますか? のセマンティックはscalac -Xlint
何ですか? それはすべてを有効にしますか?デフォルトのセット (どれ) ? 何もしませんか?
注: Scala 2.11.8 および sbt 0.13.9
新しいバージョンが異なる動作/機能を提供する場合は、それらを更新することは問題ではないので、私に知らせてください
scala - IntelliJ IDEA で Scala コンパイラ プラグインをデバッグする
scalac用のコンパイラ プラグインを作成したいのですが、IntelliJ IDEA からコードを実行およびデバッグできないため、開発の初期段階で問題が発生します。
これらのチュートリアルを使用して、ダミー プラグインを実装します。
私の目標は、IDEA のデバッグ モードで何らかの形でプラグインを実行して、ブレークポイントに遭遇することです。
アップデート:
以下の回答は非常に役に立ちましたが、実際には、 JAVA_OPTS環境変数のデバッグ用の引数を追加し、リモート デバッガー接続オプションまでサスペンドしました。次に、 scalacを起動し、以下で説明するリモート デバッガーを実行しました。