問題タブ [scala-macros]
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 マクロを組み合わせる方法
「type」キーワードで定義された型を使用するマクロを使用したいと考えています。どのように参照すればよいですか?
私の開始コードは
この例では、コンパイラ エラーをマークアップしました。何が起こっているかは明らかです。keyword で定義された型 T は、私が渡している型 T と同じではありません。
試したこと scala-macros に関するドキュメントはまだ多くありません。http://docs.scala-lang.org/overviews/macros/overview.htmlのセクションは、ここまで到達するのに非常に役立ちましたが、その例ではクラス レベルとメソッド レベルのジェネリックを使用しています。ドキュメントで参照されているプロジェクトである Expecty と macrocosm のコードを参照しましたが、このようなコードは見つかりませんでした。
scala - Scala マクロと Eclipse - マクロ展開のためにクラスパスで JDBC jar を取得する方法
私は Scala マクロを試していて、Eclipse と ScalaIDE プラグインを使用しています。この質問と回答に続いて、マクロ用に別の Eclipse プロジェクトを作成しました。
それはうまくいきましたが、コードの生成を支援するために JDBC を呼び出すマクロ実装を作成しようとしました。
両方postgresql-9.1-901.jbc4.jar
のプロジェクトのビルド パスに がありますが、マクロを展開すると次のエラーが発生します。
java.sql.SQLException: No suitable driver found for jdbc:postgresql://...
Q:マクロ展開に使用されるクラスパスを制御し、これを修正するにはどうすればよいですか?
アップデート
私は自分の質問に部分的に答えました...Class.forName("org.postgresql.Driver")
マクロの実装に追加すると、すべてが機能します。しかし、なぜそれを書く必要のない通常のコードと違うのかはまだわかりません。通常、クラスパスに postgres jar を配置するだけで十分です。
debugging - Scala: コードはデバッグ時にのみ実行されます (#ifdef と同等ですか?)
C++ では、次のように記述できます。
Scalaに同等のものはありますか?
scala - このマクロで型の等価性が失敗するのに、型の適合性が成功するのはなぜですか?
コンパイル時にマクロに渡されるパラメーターの型を判別しようとしています。を使用すると機能するようです<:<
が、使用すると機能しません=:=
。理由はわかりません。誰かが私を正しい方向に向けることができますか? 以下にサンプルコードを含めました。
このマクロ:
このコードで呼び出されます:
戻り値:
しかし、代わりに型の等価性 ( =:=
) をチェックすると、マクロは次のように返します。
どんな助けでも大歓迎です。
scala - Scala マクロ、型パラメーター呼び出しの生成
私はSquerylの設定を一般化しようとしています(Slickは同じ問題を引き起こします)。多くの一般的なメソッドに対して、すべてのケース クラスに明示的に名前を付ける必要は避けたいと考えています。
これは、インデックスの生成、およびすべてのケース クラスの CRUD メソッドのラッパー メソッドの作成にも当てはまります。
理想的には、クラスのリストを作成してテーブルにし、インデックスを追加してラッパー メソッドを追加することです。
値を型パラメーターとして持つことはできないと思うので、ここでは Scala マクロを適用すると思いました。また、フォームのすべてのタイプに対してメソッドを生成する必要があります。
マクロの例については理解できましたが、一般的なデータ構造を生成する方法がわかりません。
私が欲しいものを説明するために、この簡単な例を手に入れました:
どうすればいいですか?それとも、Scala Macros は間違ったツールですか?
scala - StringContext とマクロ: 簡単な例
私はStringContext
これを書くことを可能にする拡張を達成しようとしています:
ただし、指定されたタイムゾーンが無効な場合はコンパイルに失敗するという警告が追加されています(コンパイル時に決定できると仮定します)。
ヘルパー関数は次のとおりです。
マクロ以外の実装を非常に簡単に作成できます。
それで:
ここまでは順調ですね。zone"foobar"
ただし、タイムゾーンが無意味な場合 (例: )はコンパイルに失敗しません。コードは実行時に失敗します。それをマクロに拡張したいのですが、ドキュメントを読んでも、詳細に本当に苦労しています(正確にはすべての詳細です)。
ここで私を始めるのを手伝ってくれる人はいますか? 歌って踊るソリューションはStringContext
、引数が定義されているかどうかを確認し、(定義されている場合) 実行時まで計算を延期し、そうでない場合はコンパイル時にゾーンを解析しようとする必要があります。
私は何を試しましたか?
マクロ定義は、静的にアクセス可能なオブジェクトにある必要があるようです。そう:
以下のsom-snyttの提案に基づいて、これが最新の試みです:
use-site で、validzone"UTC"
が次のエラーでコンパイルに失敗します。
おそらく、Literal(Constant( .. ))
それを囲むために a を使用すべきではありませんでした。私は何を使うべきでしたか?
最後の例 - 以下の Travis Brown の回答に基づく
scala - SBT プロジェクトのマクロからのリソースの読み取り
次のようなファイルを含む、3 つのサブプロジェクトを含む Scala プロジェクトがあるとします。
Foo.scala
特定のパスでリソースを読み取る単純なマクロが含まれています。
リソースを開くことができる場合はcountLines
、行数を返します。それ以外の場合は空です。
他の 2 つの Scala ソース ファイルは、このマクロを呼び出すだけです。
と:
リソースの内容は、この質問の目的にはあまり関係ありません。
これが Maven プロジェクトの場合、ルート プロジェクトが 3 つのサブプロジェクトを集約し、 にbaz
依存するように簡単に構成できます。詳細については、この Gistを参照してください。bar
foo
Maven を使用すると、すべてが期待どおりに機能します。とBar
のリソースを表示できます:foo
bar
そしてBaz
それらすべてを見ることができます:
今、私はSBTで同じことを試しています:
しかし、今Bar
では以下のリソースしか見ることができませんfoo
:
とのみをBaz
見ることができます:foo
bar
何が起きてる?この SBT ビルド ファイルは、Maven 構成のかなり文字通りの翻訳のように思えます。たとえば、プロジェクトでコンソールを開いてbar
を読むのに問題はないのに/bar.txt
、マクロを呼び出すときにこれらのプロジェクトが独自のリソースを表示できないのはなぜですか?