как включить скрипт Groovy DSL из одного файла Groovy в другой - PullRequest
1 голос
/ 05 апреля 2019

Я создал собственную цепочку команд dsl, используя методы в скриптах groovy.У меня проблема с доступом к этой цепочке команд из другого файла groovy.Есть ли способ достичь функциональности?

Я пытался использовать «оценить», который может загрузить файл groovy, но не может выполнить цепочку команд.Я пытался использовать класс оболочки Groovy, но не смог вызвать методы.

show = { 
        def cube_root= it
}

cube_root = { Math.cbrt(it) }

def please(action) {
    [the: { what ->
        [of: { n ->
            def cube_root=action(what(n))
                println cube_root;
        }]
    }]
}

please show the cube_root of 1000

Здесь у меня есть CubeRoot.groovy, в котором выполнение «пожалуйста, покажите cube_root 1000» выдает результат как 10

У меня есть еще один заводной файл с именем "Main.groovy".Есть ли способ выполнить вышеуказанную цепочку команд непосредственно в Main.groovy как «пожалуйста, покажите cube_root 1000» и получите желаемый результат?

Main.groovy

please show the cube_root of 1000

1 Ответ

0 голосов
/ 05 апреля 2019

нет операции include в groovy / java

и вы можете использовать GroovyShell

если бы вы могли представить свой "dsl" как замыкание, то, например, это должно работать:

//assume you could load the lang definition and expression from files  
def cfg = new ConfigSlurper().parse( '''
    show = { 
            def cube_root= it
    }

    cube_root = { Math.cbrt(it) }

    please = {action->
        [the: { what ->
            [of: { n ->
                def cube_root=action(what(n))
                    println cube_root;
            }]
        }]
    }  
''' )

new GroovyShell(cfg as Binding).evaluate(''' please show the cube_root of 1000 ''')

другой способ - использовать загрузчик классов

файл Lang1.groovy

class Lang1{
    static void init(Script s){
        //let init script passed as parameter with variables 
        s.show = { 
           def cube_root= it
        }
        s.cube_root = { Math.cbrt(it) }

        s.please = {action->
            [the: { what ->
                [of: { n ->
                    def cube_root=action(what(n))
                        println cube_root;
                }]
            }]
        }  
    }
}

файл Main.groovy

Lang1.init(this)

please show the cube_root of 1000

и запустить из командной строки: groovy Main.groovy

...