問題タブ [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 マクロ: クラスに関数を追加
私はscalaマクロが初めてで、scala 2.10.0-RC3を使用しています。
クラスに関数を追加するマクロを書きたいです。使用例:
次のシナリオでこれが必要です。私の最初の試みはマクロを使用しませんでしたが、同じ特性を 2 回継承することはできないため、機能しませんでした。
私が書くことができるマクロソリューションで
scala マクロでこれを行う方法はありますか? または、これを達成する別の方法はありますか?
scala - Scala マクロで可変引数型の割り当てをチェックする
次のマクロがあるとします。
これは、「実際の」可変引数で期待どおりに機能します。
しかし、varargs 型に起因するシーケンスの動作は、私にとって混乱を招きます (Scala 2.10.0-RC3 で):
そして、推論された型で怪しいことが何も起こっていないことを示すために:
ここでコンパイル時エラーが発生すると予想していましたが、それが私が望んでいることです。私が書いたマクロのほとんどで、次のアプローチを使用しました。
そして、これはコンパイル時に問題をキャッチします:
ただし、これはハックのように感じます。これは、1 つの検証 (引数がリテラルであることの確認) と別の検証 (実際に可変引数があることの確認) を混同しています。引数をリテラルにする必要がない場合 (またはその型をジェネリックにしたい場合) も想像できます。
私は次のことができることを知っています:
しかし、これは非常に単純な (そして私は広く必要と思われる) 引数の検証を処理する醜い方法です。ここで見逃しているトリックはありますか?foo(1 :: Nil: _*)
最初の例でコンパイル時にエラーが発生することを確認できる最も簡単な方法は何ですか?
scala - Scala マクロの静的戻り型
だから私はこのマクロを持っています:
foo
を返したいと 3 回言いましたFoo
が、次のことができます (2.10.0-RC3 で):
いずれかの型パラメーターを削除すると、同じことが起こりますc.Expr
。foo
を呼び出している人が を取得していることを確認できないようにしたい場合Bar
は、ツリー自体に型の割り当てを追加する必要があります。
これは実際には非常に優れています。たとえば、マクロをある種のスキーマに向けてVocabulary
、ボキャブラリの用語を表すメンバー メソッドを使用して、クラスの匿名サブクラスを作成できます。これらは、返されたオブジェクトで使用できます。
自分が何をしているのかを正確に理解したいので、いくつか質問があります。まず、foo
メソッドの戻り値の型は実際には何のためにあるのでしょうか? (オプションの)ドキュメントにのみ利用できますか?戻り値の型を明確に制限します (たとえば、この場合は変更できませんInt
)。完全に削除すると、次のようなエラーが発生します。
しかし、私はそれをに変更することができ、呼び出し時にAny
静的に型付けされたものを取得できます。Bar
foo
第二に、この動作はどこかで指定されていますか? これはかなり基本的な一連の問題のように思えますが、明確な説明や議論を検索することはできませんでした。
scala - Scalaで封印されたトレイトを繰り返しますか?
Scalaで封印されたトレイトを反復処理できるかどうか知りたかっただけですか?そうでない場合、なぜそれが不可能なのですか?特性が封印されているので、それは可能ではないはずですか?
私がやりたいのはそのようなものです:
私が望むことは、列挙値に実装を与えることによってJavaで実行できます。Scalaに同等のものはありますか?
sbt - sbt プロジェクトで Scala 2.10-RC3 マクロをコンパイルする
私は自分のプロジェクトで SBT を使用していますが、最近マクロを追加することにしました。
だから私はこのプロジェクトの例に従いました:
https://github.com/adamw/scala-macro-debug/tree/15fc8af48a6e7772c44b726513949a8ac9c9e3b7
私はこれproject/Build.scala
を持っています:
私のディレクトリ構造は次のとおりです。
したがって、SBT は src の下ですべてをコンパイルしており、問題なく動作します。
しかし、マクロ ディレクトリ内のファイルをコンパイルすると、src ディレクトリ内のファイルで使用できないため、コンパイル エラーが発生します。
マクロをコンパイルして利用可能にし、それを使用するプロジェクトがそれを見つけられるようにするにはどうすればよいですか?
scala - メソッドシンボルと本文からメソッド定義ツリーを作成する
Scala 2.10MethodSymbol
でaをメソッド定義ツリーの左側(つまり、 )に変える便利な方法はありますか?DefDef
たとえば、トレイトのインスタンスを取得し、そのトレイトのすべてのメソッドをいくつかのデバッグ機能でラップするマクロを作成するとします。私は次のように書くことができます:
トレイトを実装する新しい匿名クラスにこれらのメソッドを固定し、そのクラスをインスタンス化するという退屈なビジネスを排除しました。興味がある場合は、ここで完全な実例を見つけることができます。
今、私はこれを書くことができます、例えば:
したがって、これは機能しますが、非常に単純な場合にのみ機能します。トレイトに、パラメーターリスト、アクセス修飾子、アノテーションなどを備えたメソッドがある場合は機能しません。
私が本当に欲しいのは、新しいボディのメソッドシンボルとツリーを受け取り、を返す関数ですDefDef
。手作業で書き始めましたが、次のような面倒な作業がたくさん含まれています。
これは、煩わしく、冗長で、エラーが発生しやすいものです。新しいReflectionAPIでこれを行うためのより良い方法がありませんか?
scala - Scalaマクロで計算されたTypeをreify句で使用するにはどうすればよいですか?
私はScalaマクロを使用していて、マクロに次のコードが含まれています。
ご覧のとおり、私はなんとかを取得できましたc.universe.Type fieldMemberType
。これは、オブジェクト内の特定のフィールドのタイプを表します。TypeBuilder
それを取得したら、reifyで新しいオブジェクトを作成したいと思います。TypeBuilder
抽象パラメータを持つ抽象クラスです。この抽象パラメータはfieldType
です。fieldType
これを以前に見つけたタイプにしたいと思います。
ここに示すコードを実行すると、が返されますfieldMemberType not found
。fieldMemberType
reify句内でを機能させる方法はありますか?
scala - Scalaでパラメーターのないコンストラクター引数を使用してCaseクラスのインスタンスを作成するにはどうすればよいですか?
反射フィールドの値で設定するScalaアプリを作成しています。これは問題なく動作します。
ただし、フィールド値を設定するには、インスタンスを作成する必要があります。空のコンストラクターを持つクラスがある場合、classOf [Person].getConstructors...を使用してこれを簡単に行うことができます。
ただし、空でないコンストラクターを使用してCaseクラスでこれを実行しようとすると、機能しません。すべてのフィールド名とその値、および作成する必要のあるオブジェクトタイプがあります。自分が持っているものを使って、Case Classをなんとかしてインスタンス化できますか?
私が持っていないのは、Case Classコンストラクターからのパラメーター名、またはパラメーターなしでこれを作成し、リフレクションを介して値を設定する方法だけです。
例に行きましょう。
私は以下を持っています
scala - Scala-Macros を使用してコンストラクターの引数名を取得する方法
scala-macros を使用して特定のコンストラクターのパラメーター名を取得する方法はありますか?
ありがとう
scala - Scala2.10マクロの文書化
例から始めましょう。List.fill
これは、Scala2.10のマクロとしてのタプルに相当します。
この方法は次のように使用できます。
この男はいくつかの点で奇妙な鳥です。まず、arity
引数はコンパイル時に使用する必要があるため、リテラル整数である必要があります。Scalaの以前のバージョンでは、(私が知る限り)メソッドの引数の1つがコンパイル時のリテラルであるかどうかを判断する方法さえありませんでした。
次に、Product
リターンタイプは嘘です。静的リターンタイプには、上記のように、引数によって決定された特定のアリティと要素タイプが含まれます。
では、このことをどのように文書化するのでしょうか?現時点ではScaladocのサポートは期待していませんが、マクロメソッドを実行するための規則やベストプラクティス(コンパイル時のエラーメッセージが明確であることを確認するだけでなく)を理解したいと思います。潜在的に奇妙な要求—Scala2.10ライブラリのユーザーにとってはそれほど驚くことではありません。
新しいマクロシステムの最も成熟したデモンストレーション(たとえば、ScalaMock、Slick 、ここにリストされているその他)は、メソッドレベルではまだ比較的文書化されていません。同様のマクロシステムを備えた他の言語のものを含め、任意の例またはポインタをいただければ幸いです。