私はケーキパターンを使用しているプロジェクトにいくつかのマクロを統合する必要があります。そのパターンは、他の利点の中でも、我々が輸入の盛り上がりを避けることを可能にしたので、我々はそれを保つつもりです。さて、私たちはトランクの外でテストしていたいくつかの実験マクロで問題に直面しています。まずは、ケーキという名前のダミーシステムを示してみましょう:ケーキパターンとマクロを統合することは可能ですか?
trait APiece {
class A
}
trait BPiece { this: APiece =>
def aMacro(a: A): Unit =() /* macro ??? */
}
trait CPiece { this: APiece with BPiece =>
def aMacroInvoker = aMacro(new A)
}
class Cake { this: APiece with BPiece with CPiece => }
個々にするクラスを定義し、BPieceは個々に定義されたクラスを使用し、最終的には、CPieceは、マクロを呼び出すマクロことになっています。私はBPieceを実装するためのコードを書くことができなかったので、BPieceはマクロであると言いました。私はいくつかの方法を試してみましたが、私はいつも次のエラーでクラッシュ:
"macro implementation must be in statically accessible object"
macros code 1は、静的モジュールにマクロを囲むneccesaryであることを推測することができます読み取ります。システム構造を使用するマクロを展開する方法はありますか?
私は彼の問題を解決するとは思わないし、私は何も考えないと思う。あなたが知っておくべきであるように、ケーキパターンの本質! :-) - "クライアント"コードで必要なレイヤーを選択できるようになりました。 'マクロス(Macros) 'が静的であれば、自由にそれを切り替えることはできません。ソースファイルやクラスファイルを切り替えることはできますが、「ここからマクロを使用し、そこからマクロを使用します」というコードを記述することはできません。 –
偉大な、私は新しい問題が発生すると思うが、私は今この解決策を続けることができます。どうもありがとうございました!ダニエル、私たちのシステムは本当に(ケーキパターン)マクロで純粋になるわけではありません。私たちは、クライアントが使用したいかどうかをクライアントが決定できるようにします。だから、私はこれが十分に良いことを願っています。 – jeslg
@ DanielC.Sobralアイデアはケーキの中にマクロを宣言することでした。異なるマクロ実装を参照するマクロを定義するレイヤーが異なる場合は、必要に応じてそれらを切り替えて、異なる動作を得ることができます。 –