我试图定义一个能够决定如何解析CSV的DSL。我想定义简单的函数来转换值,因为值是从CSV中提取的。 DSL将在文本文件中定义。
例如,如果CSV如下所示:
id,name,amt
1,John Smith,$10.00
2,Bob Uncle,$20.00
我想定义以下函数(请注意我希望能够执行任意代码) amt 列
(x: String) => x.replace("$", "")
有没有办法评估上面的函数并为每个 amt 值执行它?
答案 0 :(得分:1)
首先,请考虑可能有更好的方法来做到这一点。首先,看来外部DSL包含Scala代码。这真的需要成为DSL吗?
也就是说,可以使用ToolBox来评估任意Scala:
import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox
val code = """(x: String) => x.replace("$", "")"""
val toolbox = runtimeMirror(getClass.getClassLoader).mkToolBox()
val func = toolbox.eval(toolbox.parse(code)).asInstanceOf[String => String]
println(func("$10.50")) // prints "10.50"