Pull to refresh
17
0
Send message
DSL реализован с помощью AST трансформаций на этапе компиляции. Все выражения конвертируются и заменяются на соответствующие вызовы методов библиотеки. После этого на выходе получаем обычный Groovy скрипт. К примеру, файл из статьи HelloGrules.groovy будет выглядеть следующим образом:

public class test.HelloGrules extends groovy.lang.Script {

    public test.HelloGrules() {
    }

    public test.HelloGrules(groovy.lang.Binding context) {
        super.setBinding(context)
    }

    public static void main(java.lang.String[] args) {
        org.codehaus.groovy.runtime.InvokerHelper.runScript(test.HelloGrules, args)
    }

    public java.lang.Object run() {
        this.applyRuleToRequiredParameter('email', {
            org.grules.script.expressions.SubrulesSeqWrapper.wrap(new org.grules.script.expressions.FunctionTerm({
                this.isEmail(it)
            }, 'isEmail') [ 'Invalid email'])
        })
        this.applyRuleToRequiredParameter('age', {
            org.grules.script.expressions.SubrulesSeqWrapper.wrap(new org.grules.script.expressions.FunctionTerm({
                this.toPositiveInt(it)
            }, 'toPositiveInt') [ 'Invalid age']) >> {
                it  > 18
            } [ 'You must be and adult']
        })
    }
}

Затем, на этапе выполнения, скармливаем скрипту набор входящих параметров и, анализируя результат каждого метода, собираем все воедино в виде отчета.

Добавил HelloWorld пример для наглядности. Также есть небольшое видео с туториалом по использованию библиотеки в проекте под управлением Grails (English).
В этом видео с шестой минуты идет немного более детальное объяснение.
Тут можно найти пример Groovy DSL для валидации данных. Так как тема довольно новая, хорошей литературы особо не найдешь, при написании библиотеки я в основном использовал открытую докумнтацию по Groovy и статьи других разработчиков DSL. Сорсы проекта лежат на гитхабе.

На Scala можно довольно быстро написать собственный компилятор, но вы теряете преимущества встроенных DSL.
разработка Domain-Specific Languages (DSL) с помощью Groovy/Scala
пока не пробовал, я стараюсь держать как можно меньше логики в шаблонах и поэтому пока такой надобности не возникало
или Closure Templates от гугла, есть Java и JavaScript версия
представляю если кто-то найдет уязвимость и устроит небольшой кармагедон
как сказал Задорнов, Сколково в России – это дискотека на кладбище
график показывает тенденцию, посему раскаладка особо роли не играет
с такой кнопкой «вход» им только рейтинги выставлять…
чтобы время обработки не менялось нужно чтобы выполнялось следующее условие:

(99 * 1 + 1 * 10 000 ) / 100 = (98 * 1 + 2 * 10 000) / x

отсюда x = 199.02 сервера
или выдают сообщение при длине поста больше N символов
Спасибо, поправил
<a href=\"policy_contact.html\" target=\"_blank\" onclick=\"DoWin(this.href,360,440); return false;\">Refund Policy and Contact Information</a>

объясните зачем в конце нужен "return false"?
с Вас никогда не выйдет хороший тимлид
ПИПЛ ХЕЛП!

немогу настроить почту :(

приходит:

This is an automatically generated Delivery Status Notification

Delivery to the following recipient failed permanently:

admin@mydomain.ru

Technical details of permanent failure:
PERM_FAILURE: Gmail tried to deliver your message, but it was rejected by the recipient domain. The error that the other server returned was: 550 550 Requested action not taken: mailbox unavailable. We recommend contacting the other email provider for further information about the cause of this error. Thanks for your continued support. (state 14)

----- Original message -----

Received: by 10.86.71.1 with SMTP id t1mr24345345fga.7.43453453453453;
Sun, 06 Apr 2008 03:08:11 -0700 (PDT)
Received: by 10.86.81.4 with HTTP; Sun, 6 Apr 2008 03:08:11 -0700 (PDT)
Date: Sun, 6 Apr 2008 13:08:11 +0300
From: "Somebody"
To: admin@ .ru
Subject: test
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
кто-то разобрался как настроить почтовый редирект?

Information

Rating
Does not participate
Registered
Activity