Встроенные примитивы Йены?

У меня есть вопрос о некоторых встроенных примитивах. Можно ли использовать встроенные модули: разность, минимальная, максимальная, сумма и для типов DateTime или для этого лучше создавать собственные встроенные модули? Они отлично работают с целыми числами и числами с плавающей запятой, но, похоже, не для типов DateTime (или, возможно, синтаксис, который я использовал, неправильный).

1 ответ

Ваш синтаксис не правильный. Во-первых, мы можем перепрыгнуть Builtin это Javadoc для того, чтобы определить, что Builtin есть.

выбирающий Max Как вы упомянули об этом, можем ли мы пойти дальше и посмотреть его полное имя класса в GrepCode. Как только мы туда доберемся, мы заметим, что реализуемый метод bodyCall(Node[], int, RuleContext) Итак, давайте посмотрим на его реализацию (по состоянию на 2.11.0) и посмотрим, почему он так себя ведет:

@Override
public boolean bodyCall(Node[] args, int length, RuleContext context) {
    checkArgs(length, context);
    BindingEnvironment env = context.getEnv();
    Node n1 = getArg(0, args, context);
    Node n2 = getArg(1, args, context);
    if (n1.isLiteral() && n2.isLiteral()) {
        Object v1 = n1.getLiteralValue();
        Object v2 = n2.getLiteralValue();
        Node res = null;
        if (v1 instanceof Number && v2 instanceof Number) {
            Number nv1 = (Number)v1;
            Number nv2 = (Number)v2;
            if (v1 instanceof Float || v1 instanceof Double 
            ||  v2 instanceof Float || v2 instanceof Double) {
                res = (nv1.doubleValue() > nv2.doubleValue()) ? n1 : n2;
            } else {
                res = (nv1.longValue() > nv2.longValue()) ? n1 : n2;
            }
            return env.bind(args[2], res);
        }
    }
    // Doesn't (yet) handle partially bound cases
    return false;
}

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

Обратите внимание, что если мы посмотрим на реализацию (по состоянию на 2.11.0) из LessThan#bodyCall(Node[], int, RuleContext) мы можем проследить его поведение к использованию Util это чувствительно к объектам даты / времени.

Если у вас есть правило, которое использует max(?a ?b ?c) привязать максимальное значение к ?c, вы можете иногда (если ваше правило имеет хорошую симметрию) использовать lessThan(?a ?b) просто ограничить способы, которыми правило связывается (таким образом, достигая того же самого результата). в lessThan случае, остальная часть правила может продолжаться при условии, что ?b была большая ценность, все вместе. Опять же, это требует, чтобы ваше правило имело хорошую симметрию, которая в других местах позволяет связывать ?a а также ?b без других ограничений.

Если вам нужен эквивалент Max что можно использовать XSDDateTime литералы, тогда вам, возможно, придется самим что-то делать. К счастью, как код для этих Builtin с шоу, на самом деле это может быть довольно легко создать их.

Если говорить более философски, я не уверен, было ли это сознательным решением разработчиков или, возможно, небольшим недосмотром. Я представляю, что сравнение утилит (Util) использован LessThan на самом деле может быть новее, чем Max встроенный, так Max не было реализовано с точки зрения этого.

Другие вопросы по тегам