Scala マクロでは、次のようなことをしたい:
私はTree
(おそらく大きい)を持っています。ここで、具体的な形を持つこのツリーのサブツリーを見つけたいと思いますApply(_, _)
。そして、元のツリーのコピーである新しいツリーを作成したいのですが、見つかったサブツリーは他のツリーに置き換えられます。
このようなものを使用すると、たとえば、あるメソッドの呼び出しを別のメソッドの呼び出しに置き換えることができます。
このようなことは可能ですか?
Scala マクロでは、次のようなことをしたい:
私はTree
(おそらく大きい)を持っています。ここで、具体的な形を持つこのツリーのサブツリーを見つけたいと思いますApply(_, _)
。そして、元のツリーのコピーである新しいツリーを作成したいのですが、見つかったサブツリーは他のツリーに置き換えられます。
このようなものを使用すると、たとえば、あるメソッドの呼び出しを別のメソッドの呼び出しに置き換えることができます。
このようなことは可能ですか?
ツリー変換の代替アプローチに非常に興味がありますが、まだ実現していません (実際、この方向で調査が進行中です)。
その間に物事を成し遂げるために、 を拡張Transformer
し、そのメソッドをオーバーライドしてtransform
から、関心のあるツリーの具体的な形式に対してパターン マッチを行うことができますsuper.transform
。サブツリーで再帰的に置換するために呼び出します。
出来ますか???はい!_
一般的な概念は、「永続的なデータ構造」です。新しいバリアントの元の値を可能な限り「持続」するもの。
木に関して言えば、「ジッパー」の概念が当てはまります。これにより、新しいバリアントを作成するために適用した変更を元に最大限に共有する新しい値を再構築できるデータ構造を維持しながら、グラフ構造にナビゲートできます。
見てみな。ScalaZ を含む実装だけでなく、多くの参考文献を見つけることができます。