
Комментарии 4
Для Java нечто подобное уже реализовано в библиотеке JINQ. Только там парсится сам байткод лямбды, и поэтому очень много подковерной магии.
Спасибо за информацию. Надо будет ознакомиться!
Я пытался найти решения для kotlin и как-то упустил, что может быть решение для java. И, раз они парсят байт-код, то для kotlin оно тоже должно работать.
Да, хитро придумано, с сериализацией объекта лямбды и де-сериализации в свой класс, чтобы в недрах покопаться. Вижу, что автор столкнулся со схожими проблемами, и тоже воевал с замыканиями.
Существенным отличием, кмк, является наличие у меня промежуточного AST, которое достаётся из лямбды. Дальше его можно использовать как для работы с БД, так и для других нужд. Jinq заточен на работу с БД, т.е. это не универсальное средство.
И, как выяснилось, специфика решения затрудняет использование в kotlin:
Что не отменяет того факта, что библиотеку я проморгал на этапе подготовки :) А автору моё уважение, видно что очень много труда вложено.
К слову о шарп:
Вот простой пример кода. Есть 2 функции, одна принимает
Func, другая -Expression. В обе можно передать одну и ту же лямбду.
По форме - да, по сути - нет. Вы передаете экземпляры различных типов, хоть и записанные дословно одинаково. То есть вот так вот у вас не получится:
var f = it => it * 2;
ReceiveLambda(f);
ReceiveExpression(f};
Прокачиваем kotlin: используем AST лямбд в рантайме