Что делает Выражение. Уменьшите (), делают?

Я работал с деревьями выражений в течение нескольких дней теперь, и мне любопытно знать что Выражение. Уменьшите (), делает. Документация MSDN не очень полезна, поскольку она только указывает, что "уменьшает" выражение. На всякий случай я попробовал пример (см. ниже) проверять, включал ли этот метод математическое сокращение, но это, кажется, не имеет место.

Кто-либо знает то, что делает этот метод и действительно ли возможно обеспечить быстрый пример, показывающий его в действии? Какие-либо хорошие ресурсы там?

static void Main(string[] args)
{
    Expression> func = x => (x + x + x) + Math.Exp(x + x + x);
    Console.WriteLine(func);
    Expression r_func = func.Reduce();
    Console.WriteLine(r_func); // This prints out the same as Console.WriteLine(func)
}

35
задан abatishchev 4 May 2017 в 19:04
поделиться

3 ответа

Документ, на котором вам нужно посмотреть, является EXPR-Tree-SPEC.DOC .

Это спецификация для деревьев выражения. Прочитайте «2,2 приводных узла» и «4.3.5 Уменьшить метод» секции.

В основном этот метод предназначен для людей, реализующихся или портировании своих динамических ланга в .NET .NET. Так что они могут создавать свои собственные узлы, которые могут «уменьшить» на стандартные узлы деревьев выражения и могут быть скомпилированы. В API Expression есть несколько «сводимых» узлов, но я не знаю, сможете ли вы получить какие-либо практические примеры (поскольку все стандартные узлы выражения компиляции в любом случае, когда конечный пользователь, который вы, вероятно, не заботится, являются ли они «уменьшены «За кулисами или нет).

Да, документация MSDN очень простой в этой области, поскольку основной источник информации и документов для языковых исполнителей http://dlr.codeplex.com/

29
ответ дан 27 November 2019 в 07:06
поделиться

Я устанавливаю таблицы в отдельных тестовых базах данных следующим образом:

mysql> use test;
mysql> create table foo as select 42 as id from dual;
mysql> create database test2;
mysql> use test2;
mysql> create table bar as select 42 as id from dual;

Я провел следующий скрипт PHP с MySQL 5.1.41 и PHP 5.3.1 на Mac OS X:

<?php

$link = mysql_connect('localhost', 'root', 'XXXX')
 or die('There was a problem connecting to the database.');
mysql_select_db('test');

$sql = "SELECT * FROM foo JOIN test2.bar USING (id)";
if (($result = mysql_query($sql)) === FALSE) {
  die(mysql_error());
}

while ($row = mysql_fetch_array($result)) {
  print_r($row);
}

этот тест преуспевает Результатом является соединение между двумя таблицами в отдельных базах данных.

Вы всегда должны быть в состоянии выбрать из таблицы (ы), квалифицированных их соответствующими именами баз данных в SQL. MySQL API в PHP не ограничивает вас запросить одну базу данных.

Вы всегда должны иметь возможность пропустить квалификацию базы данных для «текущей» базы данных, которые вы объявляете с MySQL_SELECT_DB () .

-121--3067662-

Я предполагаю, что его больше для различных поставщиков LINQ используют их для преобразования определенных типов узлов в более простое представление AST.

Поскольку документы являются скудными, могут быть использованы для Общее преобразование под воздействием для устранения избыточных выражений. Если ваша функция вычисляла X + X более одного раза без изменения локального X, вы можете упростить его, сохраняя результат первого выражения во временное. Возможно, это будет до того, как поставщик LINQ будет необязательно реализовать эти преобразования.

Или если вы вложили Blockexpessionsionsions , которые не содержали кода (выражение, как {{{}}}), те могут быть устранены, или пустая кондиционер ...

1
ответ дан 27 November 2019 в 07:06
поделиться

С небольшим разочарованием я обнаружил, что выражение.Canreduce всегда Reutrns FALSE и Expression.recuce () всегда возвращается это . Однако есть несколько типов, которые переопределяют оба. Lambdaexpression наследует реализации по умолчанию, что объясняет, почему выражения, которые были пробованы до сих пор, не работают.

Один из типов, которые изменяют under (), представляет собой rillInitexpression, что привело меня к следующему успешному эксперименту:

class ReduceFinder : ExpressionVisitor {
    public override Expression Visit(Expression node) {
        if (node != null && node.CanReduce) {
            var reduced = node.Reduce();
            Console.WriteLine("Found expression to reduce!");
            Console.WriteLine("Before: {0}: {1}", node.GetType().Name, node);
            Console.WriteLine("After: {0}: {1}", reduced.GetType().Name, reduced);
        }
        return base.Visit(node);
    }
}

class Foo {
    public int x;
    public int y;
}

static class Program {
    static void Main() {
        Expression<Func<int, Foo>> expr = z => new Foo { x = (z + 1), y = (z + 1) };
        new ReduceFinder().Visit(expr);
    }
}

вывод:

Found expression to reduce!  
Before: MemberInitExpression: new Foo() {x = (z + 1), y = (z + 1)}  
After: ScopeN: { ... }  
23
ответ дан 27 November 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: