groovy命令表达式如何执行嵌套表达式?
我正在用Groovy开发一个不错的小DSL 我非常喜欢高阶函数的命令表达式 使用少量代码,我可以做到:groovy命令表达式如何执行嵌套表达式?,groovy,dsl,Groovy,Dsl,我正在用Groovy开发一个不错的小DSL 我非常喜欢高阶函数的命令表达式 使用少量代码,我可以做到: timerange = from today to tomorrow 这实际上是 timerange = from(today).to(tomorrow) 但现在我想做这样的事情: difference = difference from today to tomorrow difference = difference(from(today).to(event.start)) 这将导
timerange = from today to tomorrow
这实际上是
timerange = from(today).to(tomorrow)
但现在我想做这样的事情:
difference = difference from today to tomorrow
difference = difference(from(today).to(event.start))
这将导致如下结果:
difference = difference from today to tomorrow
difference = difference(from(today).to(event.start))
我总是会出错:
类:Script1没有这样的属性:from
下面是一个带有main方法的测试类。第三个断言失败:
有人能给我举个例子吗
import groovy.time.DatumDependentDuration
/**
* Created by IntelliJ IDEA.
* User: nils
* Date: 2/18/12
* Time: 4:41 PM
*/
class SimpleTest {
def static today = new Date();
def static tomorrow = new Date() + 1;
def loadDSL(Closure cl) {
cl.delegate = this
return cl()
}
def toMethod = { date ->
[to: { timeThing ->
if (timeThing instanceof Date) {
use(groovy.time.TimeCategory) {
(date..timeThing) //return Range
}
}
}]
}
def from(Date date) {
toMethod(date)
}
def difference(Range range) {
range.size() //for the sake of simplicity
}
static void eval(dslContent, assertion) {
SimpleTest runner = new SimpleTest()
def dsl = """
run {
${dslContent}
}
"""
def binding = new Binding()
binding.run = { Closure cl -> runner.loadDSL(cl) }
binding.today = today;
binding.tomorrow = tomorrow;
GroovyShell shell = new GroovyShell(binding)
shell.evaluate(dsl)
assert binding.variables.x == assertion
}
static void main(String[] args) {
eval("x = from today to tomorrow", (today..tomorrow))
eval("x = difference(from(today).to(tomorrow))", 2)
eval("x = difference from today to tomorrow ", 2)
}
}
导入groovy.time.DatumDependentDuration
/**
*由IntelliJ IDEA创建。
*用户:零
*日期:2012年2月18日
*时间:下午四时四十一分
*/
类SimpleTest{
def static today=新日期();
def static MOTORY=新日期()+1;
def loadDSL(关闭cl){
cl.delegate=这个
返回cl()
}
def toMethod={date->
[收件人:{timeThing->
if(时间事件实例of Date){
使用(groovy.time.TimeCategory){
(date..timeThing)//返回范围
}
}
}]
}
def from(日期){
toMethod(日期)
}
def差异(范围){
range.size()//为了简单起见
}
静态void eval(内容、断言){
SimpleTest runner=新SimpleTest()
def dsl=“”
跑{
${dslContent}
}
"""
def binding=新绑定()
binding.run={Closure cl->runner.loadDSL(cl)}
binding.today=今天;
明天=明天;
GroovyShell shell=新GroovyShell(绑定)
shell.evaluate(dsl)
assert binding.variables.x==断言
}
静态void main(字符串[]参数){
评估(“x=从今天到明天”,“今天..明天”)
eval(“x=差异(从(今天)到(明天))”,2)
评估(“x=今天与明天的差异”,2)
}
}
这是一个完全例外:
Exception in thread "main" groovy.lang.MissingPropertyException: No such property: from for class: Script1
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231)
at Script1$_run_closure1.doCall(Script1.groovy:3)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:883)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
at Script1$_run_closure1.doCall(Script1.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:883)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:54)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
at SimpleTest.loadDSL(SimpleTest.groovy:17)
at SimpleTest$loadDSL.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
at SimpleTest$loadDSL.call(Unknown Source)
at SimpleTest$_eval_closure2.doCall(SimpleTest.groovy:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:883)
at groovy.lang.MetaClassImpl.invokePropertyOrMissing(MetaClassImpl.java:1099)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1055)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:883)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
at Script1.run(Script1.groovy:2)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:580)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:618)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:589)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrap.invoke(PogoMetaMethodSite.java:247)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:64)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at SimpleTest.eval(SimpleTest.groovy:54)
at SimpleTest$eval.callStatic(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:50)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:157)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:169)
at SimpleTest.main(SimpleTest.groovy:62)
线程“main”groovy.lang.MissingPropertyException中出现异常:没有此类属性:对于类:Script1
位于org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
位于org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231)
在Script1$\u运行\u closure1.doCall时(Script1.groovy:3)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
位于groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
位于org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
位于groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:883)
位于org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
在Script1$\u运行\u closure1.doCall(Script1.groovy)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
位于groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
位于org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
位于groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:883)
位于org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
位于org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:54)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
在SimpleTest.loadDSL(SimpleTest.groovy:17)
在SimpleTest$loadDSL.call时(未知源)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
在SimpleTest$loadDSL.call时(未知源)
在SimpleTest$\u eval\u closure2.doCall(SimpleTest.groovy:48)上
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
位于groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
位于org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
位于groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:883)
在groovy.lang.MetaClassImpl.InvokePropertyForming(MetaClassImpl.java:1099)上
位于groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1055)
位于groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:883)
位于org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
在org.codehaus.groove
static void main(String[] args) {
eval("x = from today to tomorrow", (today..tomorrow))
eval("x = difference(from(today).to(tomorrow))", 2)
eval("x = from today to tomorrow difference", 2)
}