我正在尝试编写一个函数,该函数使用 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:_*))
}
但是在这里我被困住有两个原因:
- 我不知道如何获得预先计算的值 (
$value
) - 对于大小为 3、4、6、9 和 27 的数组,我需要其中几个函数。有没有办法干燥定义,或者我应该写
fill3
,fill4
,fill6
等。
有正确的方法吗?我怎样才能解决我的两个问题?
编辑:我意识到我最初的问题很愚蠢,因为必须在编译时知道大小......