groovy命令表达式如何执行嵌套表达式?

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)) 这将导

我正在用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))
这将导致如下结果:

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)

    }