Парсинг дерева лямбда-выражения

Стандарт не определяет, как должна быть реализована функция exp (или любая другая функция математической библиотеки 1 sup>), таким образом, каждая реализация библиотеки может использовать разные вычислительные методы.

Например, библиотека Android C ( bionic ) использует приближение exp (r) специальной рациональной функцией на интервале [0,0.34658] и сокращает результат. [ 117]

Вероятно, библиотека Microsoft использует другой вычислительный метод (не может найти информацию о нем), что приводит к другим результатам.

Кроме того, библиотеки могут использовать стратегию динамической загрузки (т.е. загрузить .dll, содержащую фактическую реализацию), чтобы использовать различные аппаратные специфические функции, что делает его еще более непредсказуемым, даже при использовании одного и того же компилятора. [ 119]

Чтобы получить одинаковую реализацию на обеих (всех) платформах, вы можете использовать собственную реализацию функции exp, не полагаясь на разные реализации разных библиотек.

Примите во внимание, что, возможно, процессоры используют разные подходы к округлению, что также привело бы к другому результату.

1 sup> Есть некоторые исключения из них, например, функция sqrt или std :: fma и некоторые функции округления и базовая арифметика. операции

15
задан Enamul Hassan 15 July 2015 в 23:01
поделиться

3 ответа

Помните, что, когда Вы имеете дело с лямбда-выражением как дерево выражений, у Вас нет исполняемого кода. Скорее у Вас есть дерево элементов выражения, которые составляют выражение, которое Вы записали.

У Charlie Calvert есть хорошее сообщение, которое обсуждает это подробно. Включенный пример использования выражения visualiser для отладки выражений.

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

Я взломал вместе быстрый пример этого - надеются, что он поставляет то, в чем Вы нуждаетесь.

public class Class1
{
    public string Selection { get; set; }

    public void Sample()
    {
        Selection = "Example";
        Example<Book, bool>(p => p.Title == Selection);
    }

    public void Example<T,TResult>(Expression<Func<T,TResult>> exp)
    {
        BinaryExpression equality = (BinaryExpression)exp.Body;
        Debug.Assert(equality.NodeType == ExpressionType.Equal);

        // Note that you need to know the type of the rhs of the equality
        var accessorExpression = Expression.Lambda<Func<string>>(equality.Right);
        Func<string> accessor = accessorExpression.Compile();
        var value = accessor();
        Debug.Assert(value == Selection);
    }
}

public class Book
{
    public string Title { get; set; }
}
21
ответ дан 1 December 2019 в 03:35
поделиться

Для получения фактического значения необходимо применить логику дерева выражений к любому контексту, который Вы имеете.

Смысл деревьев выражений - то, что они представляют логику как данные вместо того, чтобы оценить выражение. Необходимо будет разработать то, что действительно означает лямбда-выражение. Это может означать оценивать некоторые части его против локальных данных - необходимо будет решить это для себя. Деревья выражений очень мощны, но это не простой вопрос, чтобы проанализировать и использовать их. (Спросите любого, кто записал поставщику LINQ... Frans Bouma несколько раз оплакивал трудности.)

1
ответ дан 1 December 2019 в 03:35
поделиться

Я не уверен, что понимаю. Где Вы "видите" это? Это во время проектирования или время выполнения? Лямбда-выражения могут считаться по существу анонимными делегатами и будут работать с задержанным выполнением. Таким образом, Вы не должны ожидать видеть значение, присвоенное, пока выполнение не передало ту строку, очевидно.
Я не думаю, что это действительно, что Вы имеете в виду, хотя..., если Вы разъясняете вопрос немного, возможно, я могу помочь :)

-1
ответ дан 1 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

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