scala マクロを使用して、指定された値で配列を埋める関数を作成しようとしています。たとえば、次の呼び出し:
val ary = Array( 0, 1, 2 )
fill3( ary, 50+25 )
次のように拡張する必要があります。
val ary = Array(0, 1, 2 )
{
val $value = 50+25
ary(0) = $value
ary(1) = $value
ary(2) = $value
}
これが私の最初の試みです:
def fill3( ary: Array[Int], x: Int ) = macro fill_impl3
def fill_impl3( c: Context )
( ary: c.Expr[Array[Int]], x: c.Expr[Int]): c.Expr[Unit] = {
import c.universe._
def const(x:Int) = Literal(Constant(x))
//Precompute x
val valName = newTermName("$value")
val valdef = ValDef( Modifiers(), valName, TypeTree(typeOf[Int]), x.tree )
val updates = List.tabulate( 3 ){
i => Apply( Select( ary.tree, "update"), List( const(i), ??? ) )
}
val insts = valdef :: updates
c.Expr[Unit](Block(insts:_*))
}
しかし、ここでは 2 つの理由で立ち往生しています。
- 事前計算された値を取得する方法がわからない (
$value
) - サイズ 3、4、6、9、および 27 の配列には、これらの関数がいくつか必要です。定義を乾燥させる方法はありますか、または、、、などと書く必要が
fill3
ありfill4
ますfill6
。
続行する正しい方法はありますか?どうすれば私の2つの問題を解決できますか?
編集:コンパイル時にサイズを知る必要があるため、最初の質問が愚かであることに気付きました...