Как стать автором
Обновить

Комментарии 4

Для Java нечто подобное уже реализовано в библиотеке JINQ. Только там парсится сам байткод лямбды, и поэтому очень много подковерной магии.

Спасибо за информацию. Надо будет ознакомиться!

Я пытался найти решения для kotlin и как-то упустил, что может быть решение для java. И, раз они парсят байт-код, то для kotlin оно тоже должно работать.

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

Существенным отличием, кмк, является наличие у меня промежуточного AST, которое достаётся из лямбды. Дальше его можно использовать как для работы с БД, так и для других нужд. Jinq заточен на работу с БД, т.е. это не универсальное средство.

И, как выяснилось, специфика решения затрудняет использование в kotlin:

https://stackoverflow.com/questions/40064479/jinq-in-kotlin-how-to-convert-lambda-into-java-serializedlambda

Что не отменяет того факта, что библиотеку я проморгал на этапе подготовки :) А автору моё уважение, видно что очень много труда вложено.

К слову о шарп:

Вот простой пример кода. Есть 2 функции, одна принимает Func, другая - Expression. В обе можно передать одну и ту же лямбду.

По форме - да, по сути - нет. Вы передаете экземпляры различных типов, хоть и записанные дословно одинаково. То есть вот так вот у вас не получится:

var f = it => it * 2;
ReceiveLambda(f);
ReceiveExpression(f};  

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории