我花了几个小时谷歌搜索一些东西,允许我在Scala中打开Zip文件(我知道你可以使用Java API,但我希望找到一个Scala友好的包装器,而不是写关于编写Buffered/FileInputstream等)
所以我只是在REPL中乱搞并发现了这个包
scala.tools.nsc.io.ZipArchive
Run Code Online (Sandbox Code Playgroud)
经过一些挖掘和使用后scala.tools.nsc.io.File,我设法打开了一个包含所有Scala优点的zip存档(能够foreach等)
事情是我在官方Scala 2.8.1 API文档中看不到任何提及这个包,所以我只是想知道为什么没有文档呢?它是什么?
我说"实时代码"因为我的意思不是来自文本源文件或源字符串,而是来自partialFunctions/lambdas.(我知道Ruby1.8的parseTree和C#linq可以做到)
考虑一个partialFunction f:
val f = (i: Int, j: Int) => (i + j) * 2
Run Code Online (Sandbox Code Playgroud)
我希望有一些工具像这样:
getBodyAstFrom(f) //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2'))
Run Code Online (Sandbox Code Playgroud)
我不关心语义事物(上下文解析和implicits太复杂,对我来说是不必要的),我只需要实时代码的语法树,是否可能?
检查其他人的代码可能存在问题,但我自己的代码呢?以下事情可能吗?
val f = AstFunction(i: Int, j: Int){(i + j) * 2}
f(5, 6) //=> 22
f.ast //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2'))
Run Code Online (Sandbox Code Playgroud)
它似乎需要一些黑客入侵编译器,嗯......
我想创建一个模板插件,并且第一步将任意字符串转换为它的"编译"AST表示(正如scala解释器所做的那样,我猜).所以编译器插件可以例如将someString分配给"HELLO WORLD":
@StringAnnotation("""("hello world").toString.toUpperCase""")
var someString = ""
Run Code Online (Sandbox Code Playgroud)
我目前的第一个镜头插件简而言之:
见:http://paste.pocoo.org/show/326025/
a)现在,"object o{val x = 0}"返回一个AST,但"var x = 1+ 2"不是因为它不是一个有效的.scala文件.我怎样才能解决这个问题?
b)仅仅是演示是一个好的选择吗?我应该改为使用适当的阶段覆盖computeInternalPhases还是使用-Ystop:phase?
c)是否可以将外部编译器的环境绑定到内部编译器,以便例如
var x = _
(...)
@StringAnnotation("x += 3")
Run Code Online (Sandbox Code Playgroud)
会工作?
我发现以下代码[1]使用解释器和一个类似的变量:
Interpreter interpreter = new Interpreter(settings);
String[] context = { "FOO" };
interpreter.bind("context", "Array[String]", context);
interpreter
.interpret("de.tutorials.scala2.Test.main(context)");
context[0] = "BAR";
interpreter
.interpret("de.tutorials.scala2.Test.main(context)");
Run Code Online (Sandbox Code Playgroud)
谢谢
完整代码:
class AnnotationsPI(val global: Global) extends Plugin {
import global._
val name = "a_plugins::AnnotationsPI" //a_ …Run Code Online (Sandbox Code Playgroud)