{"id":334120,"date":"2022-06-06T15:00:55","date_gmt":"2022-06-06T15:00:55","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=334120"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=334120","title":{"rendered":"<span>\u041f\u0440\u043e\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c kotlin: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c AST \u043b\u044f\u043c\u0431\u0434 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/22e\/833\/c6a\/22e833c6a40bcd5697bf88b959708000.png\" alt=\"\u042f \u0441\u043b\u044b\u0448\u0430\u043b, \u0442\u044b \u043b\u044e\u0431\u0438\u0448\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c kotlin...\" title=\"\u042f \u0441\u043b\u044b\u0448\u0430\u043b, \u0442\u044b \u043b\u044e\u0431\u0438\u0448\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c kotlin...\" width=\"1882\" height=\"1191\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/22e\/833\/c6a\/22e833c6a40bcd5697bf88b959708000.png\"\/><figcaption>\u042f \u0441\u043b\u044b\u0448\u0430\u043b, \u0442\u044b \u043b\u044e\u0431\u0438\u0448\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c kotlin&#8230;<\/figcaption><\/figure>\n<p>\u041d\u0430 kotlin \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u0430\u043c\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043a\u0443 <a href=\"https:\/\/jooq.org\" rel=\"noopener noreferrer nofollow\">JOOQ<\/a>. \u0423 \u043d\u0435\u0451 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0412\u043e\u0442 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"kotlin\">dsl.selectFrom(Tables.ANIMALS)    .where(Tables.ANIMALS.POPULATION.greaterThan(1000))    .orderBy(Tables.ANIMALS.NAME)    .map { \"${it.name}: ${it.population}\" }    .toList()<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043b\u0443\u0447\u0448\u0435? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 C# LINQ? <\/p>\n<p>\u0414\u0430, \u043c\u043e\u0436\u043d\u043e. \u0412\u043e\u0442 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"kotlin\">dsl.selectQueryableFrom(Tables.ANIMALS)    .filter { it.population > 1000 }    .sortedBy { it.name }    .map { \"${it.name}: ${it.population}\" }    .toList()<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 SQL \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0443 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430:<\/p>\n<pre><code class=\"sql\">select ((\"ANIMALS\".\"NAME\" || ': ') || cast(\"ANIMALS\".\"POPULATION\" as varchar)) \"col0\"    from \"ANIMALS\"    where \"ANIMALS\".\"POPULATION\" > 1000    order by \"ANIMALS\".\"NAME\" asc<\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 C#<\/h3>\n<p>\u0412\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430. \u0415\u0441\u0442\u044c 2 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0434\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <code>Func<\/code>, \u0434\u0440\u0443\u0433\u0430\u044f &#8212; <code>Expression<\/code>. \u0412 \u043e\u0431\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043b\u044f\u043c\u0431\u0434\u0443.<\/p>\n<pre><code class=\"cs\">internal class Program {  static void ReceiveLambda(Func&lt;int, int> lambda)  {    Console.WriteLine(lambda(2));    \/\/ (1)    Console.WriteLine(lambda);       \/\/ (2)  }   static void ReceiveExpression(Expression&lt;Func&lt;int, int>> lambda)  {    Console.WriteLine(lambda.Compile()(2));  \/\/ (1)    Console.WriteLine(lambda);               \/\/ (2)  }   public static void Main(string[] args)  {    ReceiveLambda(it => it * 2);    ReceiveExpression(it => it * 2);  } }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0443\u044e \u043b\u044f\u043c\u0431\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c (\u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043a <em>(1)<\/em>), \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c &#8212; \u0432\u044b\u0432\u0435\u0434\u0435\u0442\u0441\u044f 4.<br \/>\u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u0430\u043c\u0443 \u043b\u044f\u043c\u0431\u0434\u0443 (\u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043a <em>(2)<\/em>), \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f. \u041c\u0435\u0442\u043e\u0434, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 <code>Func<\/code>, \u0432\u044b\u0432\u0435\u0434\u0435\u0442<\/p>\n<p><code>System.Func`2[System.Int32,System.Int32]<\/code><\/p>\n<p>\u0410 \u043c\u0435\u0442\u043e\u0434, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 <code>Expression<\/code>, \u0432\u044b\u0432\u0435\u0434\u0435\u0442:<\/p>\n<p><code>it => (it * 2)<\/code><\/p>\n<p>\u0418 \u0432\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/753\/ded\/c03\/753dedc03cf0f44e7a655bead2ecfd90.png\" width=\"649\" height=\"529\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/753\/ded\/c03\/753dedc03cf0f44e7a655bead2ecfd90.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 C# \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 Expression, \u0442\u043e \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0430 <abbr title=\"Abstract Syntax Tree\" type=\"abbr\">AST<\/abbr>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u043b\u044f\u043c\u0431\u0434\u0443, \u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0438\u043c\u0435\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0442.\u0434. \u042d\u0442\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code class=\"cs\">\/\/Querying with LINQ to Entities  using (var context = new SchoolDBEntities()) {     var query = context.Students                        .where(s => s.StudentName == \"Bill\")                        .FirstOrDefault&lt;Student>(); }<\/code><\/pre>\n<p>\u0418 \u0434\u0430\u043b\u044c\u0448\u0435 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u0434 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0435\u0439 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0430\u043a \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 SQL.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u0442\u0443\u0442 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435: <a href=\"https:\/\/habr.com\/ru\/post\/256821\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/post\/256821\/<\/a><\/p>\n<p>\u0412 Kotlin\/JVM \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442. \u041b\u044f\u043c\u0431\u0434\u044b \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0438\u0445 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e. \u0414\u0430, \u0432 \u0442\u0435\u043e\u0440\u0438\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u043d\u043e \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430 \u0432 \u0441\u0438\u043b\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 kotlin:<\/p>\n<pre><code class=\"kotlin\">val a = maxOf(2, 3)<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u0438 \u0434\u0435-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 java (\u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438) \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"java\">byte var2 = 2; byte var3 = 3; final int a = Math.max(var2, var3);<\/code><\/pre>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u201c\u043f\u043e\u0442\u0435\u0440\u044f\u043b\u043e\u0441\u044c\u201d, \u0442.\u043a. \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>maxOf<\/code> \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0430 \u043a\u0430\u043a <code>inline<\/code>.<\/p>\n<p>\u0410 \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"kotlin\">val b = if (arrayOf(3).isEmpty()) 5 else 6<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"java\">Integer[] var2 = new Integer[]{3}; final int b = var2.length == 0 ? 5 : 6;<\/code><\/pre>\n<p>\u0414\u0430, \u044d\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b, \u043d\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0438\u0437 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430 \u043c\u044b 100% \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 kotlin \u043a\u043e\u0434\u0435. \u0410 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0432\u0438\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u043e\u0439, \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043e\u043d \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 AST.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0443\u0436\u043d\u043e:<\/p>\n<ol>\n<li>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u044c AST \u0438\u0437 \u043b\u044f\u043c\u0431\u0434\u044b \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c \u044d\u0442\u043e\u0442 AST \u0432 \u043a\u043e\u0434, \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0432 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043b\u044f\u043c\u0431\u0434\u043e\u0439<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.<\/p>\n<h3>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 AST \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/h3>\n<p>\u0411\u0435\u0433\u043b\u044b\u0439 \u0433\u0443\u0433\u043b\u0451\u0436 \u043d\u0430\u0448\u0451\u043b \u0434\u0432\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<br \/>\u041e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 &#8212; <a href=\"https:\/\/github.com\/cretz\/kastree\" rel=\"noopener noreferrer nofollow\"><u>kastree<\/u><\/a> &#8212; \u0437\u0430\u0431\u0440\u043e\u0448\u0435\u043d\u0430. \u0412\u0442\u043e\u0440\u0430\u044f &#8212; <a href=\"https:\/\/github.com\/kotlinx\/ast\" rel=\"noopener noreferrer nofollow\"><u>ast<\/u><\/a> &#8212;  \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0436\u0438\u0432\u043e\u0439. \u041f\u0440\u0438 \u043f\u043e\u0434\u0430\u0447\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e kotlin \u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"kotlin\">fun main() {    KotlinGrammarAntlrKotlinParser.parseKotlinFile(AstSource.String(\"\", \"\"\"        val d = { it > 5 }    \"\"\".trimIndent())).print() }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>kotlinFile   packageHeader   importList   topLevelObject     declaration       propertyDeclaration         VAL >>>val&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)         WS >>> &lt;&lt;&lt; (HIDDEN)         variableDeclaration           simpleIdentifier             Identifier >>>d&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)         WS >>> &lt;&lt;&lt; (HIDDEN)         ASSIGNMENT >>>=&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)         WS >>> &lt;&lt;&lt; (HIDDEN)         expression           disjunction             conjunction               equality                 comparison                   genericCallLikeComparison                     infixOperation                       elvisExpression                         infixFunctionCall                           rangeExpression                             additiveExpression                               multiplicativeExpression                                 asExpression                                   prefixUnaryExpression                                     postfixUnaryExpression                                       primaryExpression                                         functionLiteral                                           lambdaLiteral                                             LCURL >>>{&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)                                             WS >>> &lt;&lt;&lt; (HIDDEN)                                             statements                                               statement                                                 expression                                                   disjunction                                                     conjunction                                                       equality                                                         comparison                                                           genericCallLikeComparison                                                             infixOperation                                                               elvisExpression                                                                 infixFunctionCall                                                                   rangeExpression                                                                     additiveExpression                                                                       multiplicativeExpression                                                                         asExpression                                                                           prefixUnaryExpression                                                                             postfixUnaryExpression                                                                               primaryExpression                                                                                 simpleIdentifier                                                                                   Identifier >>>it&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)                                                           WS >>> &lt;&lt;&lt; (HIDDEN)                                                           comparisonOperator                                                             RANGLE >>>>&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)                                                           WS >>> &lt;&lt;&lt; (HIDDEN)                                                           genericCallLikeComparison                                                             infixOperation                                                               elvisExpression                                                                 infixFunctionCall                                                                   rangeExpression                                                                     additiveExpression                                                                       multiplicativeExpression                                                                         asExpression                                                                           prefixUnaryExpression                                                                             postfixUnaryExpression                                                                               primaryExpression                                                                                 literalConstant                                                                                   IntegerLiteral >>>5&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)                                             WS >>> &lt;&lt;&lt; (HIDDEN)                                             RCURL >>>}&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)     semis       EOF >>>&lt;EOF>&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)   EOF >>>&lt;EOF>&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u043e, \u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u043d\u043e. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u043b\u044f\u043c\u0431\u0434\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f.<\/p>\n<p>\u0412 \u0442\u0435\u043e\u0440\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u043a\u0430\u043a \u0435\u0441\u0442\u044c. \u041d\u043e \u043c\u043d\u0435 \u043e\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043c \u0435\u0433\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c. \u0425\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0430\u0441\u044c \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u0437 3\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0430\u043a \u0432 C#, \u0430 \u043d\u0435 300.<\/p>\n<p>\u041f\u043e\u0442\u0440\u0430\u0442\u0438\u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0443\u043f\u0440\u043e\u0449\u0430\u0442\u043e\u0440, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043b\u044f\u043c\u0431\u0434\u044b \u0432 \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0442 \u0434\u0435\u0440\u0435\u0432\u044c\u044f.<\/p>\n<pre><code>Greater(    LambdaArgument(number=0),     Value(value=5) ) <\/code><\/pre>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0448\u0435\u043d\u0430? \u041d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c. \u0427\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u0432 \u043b\u044f\u043c\u0431\u0434\u0430\u0445 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432?<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"kotlin\">val one = 1 val d = { it > one } <\/code><\/pre>\n<pre><code>Greater(    LambdaArgument(number=0),    Identifier(name=one) ) <\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043a\u043e\u0434\u0430, \u0442\u043e \u043c\u044b, \u0443\u0432\u044b, \u043d\u0435 \u0438\u043c\u0435\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438 \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u0430\u043a\u043e\u0439 \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u044f, \u0430 \u0447\u0442\u043e \u043e\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 &#8212; \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e. \u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0431\u044b\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0443 \u043d\u0430\u0441 \u044d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u0431\u044b. \u041d\u043e \u043c\u044b \u043f\u043e\u043a\u0430 \u0441\u043d\u0430\u0440\u0443\u0436\u0438.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u043e \u0432\u0441\u0451 \u043a\u0430\u043a \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0431\u0435\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430. \u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u043f\u043e\u0437\u0436\u0435. \u0410 \u043f\u043e\u043a\u0430 \u043f\u043e\u0439\u043c\u0451\u043c, \u043a\u0430\u043a \u043d\u0430\u043c \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435.<\/p>\n<p>\u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u0434\u0430<\/p>\n<p><code>filter { it > 5 }<\/code><\/p>\n<p>\u0421\u0442\u0430\u043b\u043e<\/p>\n<p><code>filter({it > 5} withExpression Greater(LambdaArgument(0), Value(5)))<\/code><\/p>\n<h3>Runtime. \u041f\u043e\u043f\u044b\u0442\u043a\u0430 1 (\u0447\u0435\u0440\u0435\u0437 KSP \u0438 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0430\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u0432)<\/h3>\n<p>\u0413\u0443\u0433\u043b\u0451\u0436 \u043f\u043e \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043d\u0430\u0441 \u043a kapt, \u0430 \u043e\u0442\u0442\u0443\u0434\u0430, \u0447\u0435\u0440\u0435\u0437 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043e\u0431 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430, \u043a KSP. \u041f\u0440\u043e \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/post\/582530\/\" rel=\"noopener noreferrer nofollow\"><u>\u0445\u043e\u0440\u043e\u0448\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/u><\/a> \u0442\u0443\u0442 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e &#8212; \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u043b\u0430\u0441\u0441\u0430\u0445, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0438 \u043f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f, \u0442.\u0435. \u0435\u0441\u043b\u0438 kotlin \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u043b 1 \u0444\u0430\u0439\u043b, \u0442\u043e \u0438 \u043d\u0430\u043c \u043e\u043d \u0437\u0430\u043a\u0438\u043d\u0435\u0442 1 \u0444\u0430\u0439\u043b \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443.<\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u0430. \u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c &#8212; \u044d\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c AST \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u0410 \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043c\u0435\u043d\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 &#8212; \u043a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0438\u0437 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430, \u0432\u0441\u0435 \u043b\u044f\u043c\u0431\u0434\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0441\u044b \u0441 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438. \u0410 \u0438\u043c\u0435\u043d\u0430 \u0443 \u043d\u0438\u0445 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u043d\u0435\u043a\u043e\u0435\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0442\u044c.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>SymbolProcessor<\/code> \u0434\u043b\u044f KSP, \u043a\u043e\u0442\u043e\u0440\u0430\u044f:<\/p>\n<ol>\n<li>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e source \u0444\u0430\u0439\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u043b\u044f\u043c\u0431\u0434\u044b \u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"kotlin\">@LambdaExpressionInitializer class `io_github_kotlinq_processortest`: Initializer {    override fun initialize(e: Expressions) {       e.registerFactory(\"io.github.kotlinq.processor.A\\$qso\\$1\") { Greater(LambdaArgument(0),Identifier(\"\"\"r1\"\"\") ) }       e.registerFactory(\"io.github.kotlinq.processor.A\\$qso\\$2\") {  Plus(Plus(LambdaArgument(0),LambdaArgument(1)),Identifier(\"\"\"r2\"\"\") ) }       e.registerFactory(\"io.github.kotlinq.processor.A\\$stream\\$1\") {  Greater(LambdaArgument(0),Plus(Identifier(\"\"\"r2\"\"\") ,Value(2))) }    } } <\/code><\/pre>\n<ol start=\"2\">\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u043a\u043b\u0430\u0441\u0441\u044b \u043d\u0430\u0448\u043b\u0438\u0441\u044c \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e, \u0442\u0430\u043a \u0436\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e <code>META-INF\/services\/&lt;\u043c\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441><\/code>, \u0433\u0434\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e \u0432\u0441\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <code>ServiceLoader<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041f\u0440\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432 java \u0442\u043e\u0436\u0435 \u0431\u044b\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435: <a href=\"https:\/\/habr.com\/ru\/post\/118488\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/post\/118488\/<\/a><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"kotlin\">object Expressions {  fun registerFactory(className: String, expressionFactory: ExpressionFactory) { .. }  internal fun getExpression(className: String): Node {    return expressions[className]!!.invoke() }  init {    for (initializer in ServiceLoader.load(Initializer::class.java)) {    initializer.initialize(this)    } } }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0439 \u043b\u044f\u043c\u0431\u0434\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (\u043d\u0443 \u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a)<\/p>\n<pre><code class=\"kotlin\">fun filter(predicate: (T) -> Boolean) {     val expression: Node = Expressions.getExpression(predicate.className)     println(expression) }<\/code><\/pre>\n<p>\u0418 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u041f\u043e\u043a\u0430 \u0432 \u043b\u044f\u043c\u0431\u0434\u0430\u0445 \u043d\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u043e\u043b\u044f, \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b &#8212; \u0438 \u0438\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u044f\u0437\u044b\u043a\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u201c\u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434\u201d:<\/p>\n<pre><code class=\"kotlin\">const val A = \"top level const\" val B get() = \"top level prop\" private val C = \"top level const\/prop\" var D = \"top level mutable prop\" fun E(): String { return \"top level fun\"}  @EmbedLambdaExpressions class ClosureExample {    fun getExpression(): Node {        val R = \"local val\"        var S = \"local var\"        fun T(): String = \"local fun\"        return lambdaAsIs({            \"test\" in listOf(A, B, C, D, E(), F, G, H, I, J(), K(), L, L(), M(), N, O, P(), Q(), R, S, T(), ClosureExample2.U, ClosureExample3.V)        }).expression()    }    companion object L {        val F = \"companion object val\"        const val G = \"companion object const\"        val H get() = \"companion object prop\"        var I: String get() = \"companion object mutable prop\"            set(_) {TODO()}        fun J(): String = \"companion object fun\"        @JvmStatic fun K(): String = \"static fun\"        operator fun invoke() = \"companion object invoke\"        override fun toString(): String { return \"companion object instance\" }    }    private fun M() = \"private class function\"    protected val N = \"protected class val\"    internal val O get() = \"internal class prop\"    inline fun P() = \"inline class function\"    inner class Q { override fun toString(): String = \"inner class instance\" }    fun &lt;L> lambdaAsIs(l: L) = l } class ClosureExample2 { companion object { val U = \"another class no-named companion object val\" } } object ClosureExample3 { val V = \"top-level object val\" } <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0441\u043e\u0441\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u0441\u043c\u043e\u0433 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b), \u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 (\u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b) \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0430. \u041d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0434\u0443\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u0431\u044b\u0442\u044c.<\/p>\n<h3>Runtime. \u041f\u043e\u043f\u044b\u0442\u043a\u0430 2 (KSP + javassist)<\/h3>\n<p>\u0412\u043e\u0442 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043b\u044f\u043c\u0431\u0434\u0430:<\/p>\n<pre><code class=\"kotlin\">filter { it > someValue }<\/code><\/pre>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 <code>someValue<\/code>, \u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441 \u043d\u0430\u0448\u0435\u0439 \u043b\u044f\u043c\u0431\u0434\u043e\u0439 \u0438 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>someValue<\/code>. \u0422.\u0435. \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code class=\"kotlin\">Expressions.setArgument(\"ClosureExample$getExpression$1\", \"someValue\", someValue) filter {it > someValue}<\/code><\/pre>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432, \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435 \u0441\u0430\u043c\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0430 \u0441\u0441\u044b\u043b\u043a\u0443<\/p>\n<pre><code class=\"kotlin\">Expressions.setArgument(\"ClosureExample$getExpression$1\", \"someFn\", ::someFn)<\/code><\/pre>\n<p>\u041d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u043b\u0438 \u0431\u0430\u0439\u0442 \u043a\u043e\u0434. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e KSP \u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0410 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0431\u0430\u0439\u0442 \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e?<\/p>\n<p>\u0414\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b. \u042f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c <a href=\"https:\/\/www.javassist.org\/\" rel=\"noopener noreferrer nofollow\">javassist<\/a>. \u0418 \u0434\u043b\u044f \u043d\u0435\u0433\u043e, \u0447\u0442\u043e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u043e, \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/post\/664818\/\" rel=\"noopener noreferrer nofollow\"><u>\u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0445\u0430\u0431\u0440\u0435<\/u><\/a>).<\/p>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0431\u0438\u043b\u0434 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439:<\/p>\n<pre><code class=\"kotlin\">task(\"kotlinqPostProcess\", JavaExec::class) {    group = \"other\"    dependsOn(\"kspKotlin\")    mainClass.set(\"io.github.kotlinq.processor.PostProcessor\")    classpath = project.sourceSets.getAt(\"main\").runtimeClasspath } tasks.build.get().dependsOn(\u201ckotlinqPostProcess\u201d) <\/code><\/pre>\n<p>\u0421\u0430\u043c <code>PostProcessor<\/code> \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043d\u0443\u0436\u043d\u044b\u043c <code>class<\/code> \u0444\u0430\u0439\u043b\u0430\u043c, \u0441\u043d\u043e\u0432\u0430 \u0438\u0449\u0435\u0442 \u043b\u044f\u043c\u0431\u0434\u044b (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0443\u0436\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c \u0432 \u043a\u043b\u0430\u0441\u0441\u044b \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>invoke<\/code>), \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u0445 \u0442\u0435\u043b\u0435 \u043d\u0430\u0439\u0442\u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. \u0410 \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 <code>class<\/code> \u0444\u0430\u0439\u043b \u0432 \u0442\u043e \u0436\u0435 \u043c\u0435\u0441\u0442\u043e.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043f\u043e\u0442\u0435\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u043c\u043e\u0435\u0433\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0435\u0441\u043b\u0438 \u043b\u044f\u043c\u0431\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434?<\/p>\n<pre><code class=\"kotlin\">class ClosureExample {    fun getExpression(): Node {        return lambdaAsIs({ M() }).expression()    }    private fun M() = \"private class function\" } <\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 <code>access$M<\/code>.<\/p>\n<pre><code>   L0     LINENUMBER 20 L0     ALOAD 0     GETFIELD io\/github\/kotlinq\/expression\/ClosureExample$getExpression$2.this$0 : Lio\/github\/kotlinq\/expression\/ClosureExample;     INVOKESTATIC io\/github\/kotlinq\/expression\/ClosureExample.access$M (Lio\/github\/kotlinq\/expression\/ClosureExample;)Ljava\/lang\/String; <\/code><\/pre>\n<p>\u0410 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043c\u0435\u0442\u043e\u0434?<\/p>\n<pre><code>  public final static synthetic access$M(Lio\/github\/kotlinq\/expression\/ClosureExample;)Ljava\/lang\/String;    L0     LINENUMBER 14 L0     ALOAD 0     INVOKESPECIAL io\/github\/kotlinq\/expression\/ClosureExample.M ()Ljava\/lang\/String;     ARETURN    L1     LOCALVARIABLE $this Lio\/github\/kotlinq\/expression\/ClosureExample; L0 L1 0     MAXSTACK = 1     MAXLOCALS = 1 <\/code><\/pre>\n<p>\u0410 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 (\u0432\u0435\u0434\u044c \u043b\u044f\u043c\u0431\u0434\u0430 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043b\u0430\u0441\u0441, \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442). \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u044d\u0442\u043e \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435? Access \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0430 \u0447\u0442\u043e \u0437\u0430 <code>$p<\/code> \u0432 \u043a\u043e\u043d\u0446\u0435?<\/p>\n<pre><code>   L0     LINENUMBER 20 L0     INVOKESTATIC io\/github\/kotlinq\/expression\/ClosureExampleKt.access$getC$p ()Ljava\/lang\/String;    L1     ARETURN <\/code><\/pre>\n<p>\u0410 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u043d\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u043d\u0430 \u0432\u044b\u0441\u0448\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435.<\/p>\n<pre><code class=\"kotlin\">private val C = \"top level const\/prop\"<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0443 \u043d\u0430\u0441 \u0434\u0432\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"kotlin\">val R = \"local val\" var S = \"local var\" return lambdaAsIs { listOf(S, R) }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0441, \u043a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u043c, \u0438 \u0432 \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0443\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0443 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u043c:<\/p>\n<pre><code>final class io\/github\/kotlinq\/expression\/ClosureExample$getExpression$2 extends kotlin\/jvm\/internal\/Lambda implements kotlin\/jvm\/functions\/Function0 {  public final invoke()Ljava\/util\/List; { ... }    \/\/ access flags 0x1010   final synthetic Lkotlin\/jvm\/internal\/Ref$ObjectRef; $S    \/\/ access flags 0x1010   final synthetic Ljava\/lang\/String; $R } <\/code><\/pre>\n<p>\u0427\u0442\u043e \u0436, \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e reflection \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f <code>R<\/code> \u0438 <code>S<\/code> \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043b\u044f\u043c\u0431\u0434\u044b. \u041d\u043e \u0435\u0441\u043b\u0438 <code>R<\/code> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 <code>val<\/code>) \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u0442\u043e \u0434\u043b\u044f <code>S<\/code> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 <code>var<\/code>) \u043d\u0430\u0434\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c <code>ObjectRef<\/code>. \u0418\u043b\u0438 <code>IntRef<\/code>. \u0418\u043b\u0438 <code>ByteRef<\/code>. \u0418 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d\u0438 \u0432\u0441\u0435 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441?<\/p>\n<pre><code class=\"kotlin\">private fun Any?.unwrap(): Any? {    return when(this) {        null -> null        is ObjectRef&lt;*> -> element        is ByteRef -> element        is IntRef -> element        is DoubleRef -> element        is FloatRef -> element        is BooleanRef -> element        is CharRef -> element        is ShortRef -> element        is LongRef -> element        else -> this    } } <\/code><\/pre>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u043e\u0441\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0438 \u0445\u0440\u0443\u043f\u043a\u0438\u043c. \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0438\u043b\u0438 \u043f\u043e\u043b\u0435, \u0438 \u0434\u0430\u0432\u0430\u0439 \u043e\u0442\u0440\u0443\u0431\u0430\u0442\u044c \u201c$\u201d \u0441 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u0438 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0443\u0433\u0430\u0434\u0430\u0442\u044c &#8212; \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043b\u0435\u0432\u043e\u0435?<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u044b\u043b\u043e \u0431\u044b \u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0449\u0435, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 \u043a\u043e\u0442\u043b\u0438\u043d\u0435. \u0412 \u0442\u0435\u043e\u0440\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0432\u0437\u044f\u0442\u044c \u043d\u0430\u0448 AST, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 <code>kotlin<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0451 \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043b\u044f\u043c\u0431\u0434\u044b, \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u0432\u0441\u0451 \u0432 \u043a\u043e\u0434. \u041d\u043e \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441: <code>javassist <\/code>\u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>java <\/code>\u043a\u043e\u0434, \u043d\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>kotlin<\/code>. \u0410 \u0442\u043e, \u0447\u0442\u043e \u0432 \u043a\u043e\u0442\u043b\u0438\u043d\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e <code>return X<\/code>, \u043d\u0430 java \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 <code>return getX()<\/code> \u0438\u043b\u0438 \u0432\u043e\u0442 \u0434\u0430\u0436\u0435 <code>return access$getX$p()<\/code><\/p>\n<p>\u042f \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0441\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c <code>C\/C++<\/code> \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u0448\u0430\u043b\u0430\u0441\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438. \u0410 \u0432\u043e\u0442 \u0432 <code>Java<\/code>\/<code>Kotlin<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438\u0437 \u0440\u0430\u0437\u0440\u044f\u0434\u0430 \u201c\u0432\u0437\u044f\u0442\u044c \u0444\u0430\u0439\u043b, \u043f\u043e\u0433\u0440\u0435\u043f\u0430\u0442\u044c \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u201d \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e. \u041d\u043e \u043d\u0430\u0434\u043e \u0436\u0435 \u0435\u0449\u0451 \u043a\u0430\u043a-\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0438\u043b\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b (\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d) \u0431\u044b\u043b \u0432\u0438\u0434\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443, \u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439 \u0432\u0438\u0434\u0435\u043b\u0430 \u0431\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u0415\u0441\u0442\u044c \u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442?<\/p>\n<p>\u0414\u0430, \u0435\u0441\u0442\u044c. \u042d\u0442\u043e \u043f\u043b\u0430\u0433\u0438\u043d \u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 <code>kotlin<\/code>.<\/p>\n<h3>Runtime. \u041f\u043e\u043f\u044b\u0442\u043a\u0430 3 (\u043f\u043b\u0430\u0433\u0438\u043d \u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043a\u043e\u0442\u043b\u0438\u043d\u0430)<\/h3>\n<p>\u041f\u0440\u043e \u044d\u0442\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u0436\u0435 <a href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/566380\/\" rel=\"noopener noreferrer nofollow\"><u>\u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0445\u0430\u0431\u0440\u0435<\/u><\/a>, \u0445\u043e\u0442\u044f \u044f \u043e\u0431\u0445\u043e\u0434\u0438\u043b\u0441\u044f <a href=\"https:\/\/blog.bnorm.dev\/writing-your-second-compiler-plugin-part-1\" rel=\"noopener noreferrer nofollow\"><u>\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0451\u0439<\/u><\/a>, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/blob\/master\/plugins\/allopen\/allopen-cli\/src\/AllOpenPlugin.kt\" rel=\"noopener noreferrer nofollow\"><u>All Open plugin<\/u><\/a>)<\/p>\n<p>\u0412 \u043f\u0430\u043a\u0435\u0442\u0435 <code>org.jetbrains.kotlin.extensions<\/code> (\u0438\u0437 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>org.jetbrains.kotlin:kotlin-compiler-embeddable:1.6.21<\/code> ) \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u042d\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0435 api \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443. \u042f \u043e\u043f\u0430\u0441\u0430\u043b\u0441\u044f, \u0447\u0442\u043e \u0442\u0443\u0442 \u0431\u0443\u0434\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u201c\u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435\u201d \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u043f\u0430\u0441\u0435\u043d\u0438\u044f \u043c\u043e\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u043f\u0440\u0430\u0441\u043d\u044b\u043c\u0438. \u0415\u0441\u0442\u044c \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 <code>PreprocessedVirtualFileFactoryExtension<\/code> , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0435\u043b\u043e \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0435\u0433\u043e \u0441 \u0434\u0438\u0441\u043a\u0430.<\/p>\n<pre><code class=\"kotlin\">\/**  * The interface for the extensions that are used to substitute VirtualFile on the creation of KtFile, allows to preprocess a file before  * lexing and parsing  *\/ interface PreprocessedVirtualFileFactoryExtension {     companion object : ProjectExtensionDescriptor&lt;PreprocessedVirtualFileFactoryExtension>(         \"org.jetbrains.kotlin.preprocessedVirtualFileFactoryExtension\",         PreprocessedVirtualFileFactoryExtension::class.java     )      fun isPassThrough(): Boolean      fun createPreprocessedFile(file: VirtualFile?): VirtualFile?     fun createPreprocessedLightFile(file: LightVirtualFile?): LightVirtualFile? } <\/code><\/pre>\n<p>\u0415\u0433\u043e \u044f \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b. \u041f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 kotlin \u0444\u0430\u0439\u043b\u0430 \u0441 \u0434\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c packages), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u0430\u043b AST, \u0438\u0441\u043a\u0430\u043b \u0432\u043d\u0443\u0442\u0440\u0438 \u043b\u044f\u043c\u0431\u0434\u044b, \u0432 \u043b\u044f\u043c\u0431\u0434\u0430\u0445 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430\u0440\u0443\u0436\u0443 &#8212; \u0432\u0441\u0451 \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435. \u0418 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044f \u043b\u044f\u043c\u0431\u0434\u044b \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441 AST \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"kotlin\">@Kotlinq fun main() {     val lambda: (Int) -> Int ={ it * 3 }     println(lambda.expression) }<\/code><\/pre>\n<p>\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432:<\/p>\n<pre><code class=\"kotlin\">@Kotlinq fun main() {     val lambda: (Int) -> Int = (withExpression1({ it * 3 }, { Multiply(LambdaArgument(0),Value(3)) }))     println(lambda.expression) } <\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u0430\u0441\u044c \u0442\u0430 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437\u0440\u0443\u043b\u0438\u0432\u0430\u043b\u0430 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. \u0412 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435 \u0436\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0432 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432\u044b\u0437\u043e\u0432 \u201c\u0431\u0435\u0437 \u0441\u043a\u043e\u0431\u043e\u0447\u0435\u043a\u201d (<code>val<\/code>, <code>var<\/code>, <code>const<\/code>), \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u201c\u0441\u043e \u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0430\u043c\u0438\u201d (\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b). \u041d\u043e \u0438 \u0442\u0443\u0442 \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u043a\u0430\u0437\u0443\u0441\u043e\u0432.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u043b\u044f\u043c\u0431\u0434\u0430:<\/p>\n<pre><code class=\"kotlin\">@Kotlinq fun main() {    val lambda: (Int) -> Boolean = { it in listOf(2, 3) } }<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432:<\/p>\n<pre><code class=\"kotlin\">@Kotlinq fun main() {     val lambda: (Int) -> Boolean = (withExpression1({ it in listOf(2, 3) }, { Call(Identifier(\"in\"),LambdaArgument(0),Call(Ref(::listOf),Value(2),Value(3))) })) }<\/code><\/pre>\n<p>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 <code>listOf<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430\u0441\u044c. \u041d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043f\u0430\u0434\u0430\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e:<\/p>\n<pre><code>Callable reference resolution ambiguity:  public inline fun &lt;T> listOf(): List&lt;T> defined in kotlin.collections public fun &lt;T> listOf(element: T): List&lt;T> defined in kotlin.collections public fun &lt;T> listOf(vararg elements: T): List&lt;T> defined in kotlin.collections<\/code><\/pre>\n<p>\u042f \u043d\u0435 \u043d\u0430\u0448\u0451\u043b \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0440\u0430\u0437\u0440\u0443\u043b\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u043d\u0430\u0434\u043e \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 &#8212; \u043a\u0430\u043a \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u043e\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430? \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043d\u0435\u0442, \u043d\u043e \u043e\u043d\u0430 \u0432\u0441\u0451 \u0436\u0435 \u0435\u0441\u0442\u044c:<\/p>\n<pre><code class=\"kotlin\">@Kotlinq fun main() {     val lambda: (Int) -> Pair&lt;Int, Int> = { Pair(it, it*2) } }<\/code><\/pre>\n<p>\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432:<\/p>\n<pre><code class=\"kotlin\">    val lambda: (Int) -> Pair&lt;Int, Int> = (withExpression1({ Pair(it, it*2) }, { Call(Ref(::Pair),LambdaArgument(0),Multiply(LambdaArgument(0),Value(2))) })) <\/code><\/pre>\n<p>\u0438 \u0432\u0430\u043b\u0438\u0442\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:<\/p>\n<p><code>Not enough information to infer type variable A<\/code><\/p>\n<p>\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043b\u0430\u0441\u0441 <code>Pair<\/code> &#8212; generic \u043a\u043b\u0430\u0441\u0441, \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0443 \u043d\u0443\u0436\u043d\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0438\u043f\u043e\u0432. \u041d\u043e \u0432 \u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438\u0445 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c. \u0411\u044b\u043b\u043e \u0431\u044b \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441, \u0430 \u043d\u0435 \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043a\u0430\u043a <code>Pair::class<\/code>. \u041d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0448 \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e <code>Pair(1,2)<\/code> \u044d\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0430 <code>listOf(1,2)<\/code> &#8212; \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0432\u0430:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u043b\u0430\u0433\u0438\u043d \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0431\u0443\u043a\u0432\u044b &#8212; \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434, \u0430 \u0435\u0441\u043b\u0438 \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 &#8212; \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u0451\u0448\u0435\u0432\u043e \u0438 \u0441\u0435\u0440\u0434\u0438\u0442\u043e.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u0440\u0443\u0442\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 <code>kotlin<\/code>. \u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0435\u0449\u0451 \u043d\u0430 \u0440\u0430\u043d\u043d\u0438\u0445 \u0441\u0442\u0430\u0434\u0438\u044f\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u043d \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441, \u0430 \u043a\u0430\u043a\u043e\u0439 &#8212; \u043c\u0435\u0442\u043e\u0434, \u0438 \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a\u0443\u044e \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443.<\/p>\n<p>\u041d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u044f \u0443\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0441\u0442\u0430\u043b \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0433\u043e&#8230; \u041d\u043e \u043d\u0435 \u0441\u0435\u0439\u0447\u0430\u0441.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u044f \u201c\u043f\u0443\u0441\u0442\u0438\u043b \u0432 \u0434\u0435\u043b\u043e\u201d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u043b \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 linq \u0441 jooq-\u043e\u043c \u0438 \u043b\u044f\u043c\u0431\u0434\u0430\u043c\u0438.<\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f JOOQ<\/h3>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0440\u0430\u0434\u0438 \u0447\u0435\u0433\u043e \u0432\u0441\u0451 \u0438 \u0437\u0430\u0442\u0435\u0432\u0430\u043b\u043e\u0441\u044c. \u0427\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 kotlin \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0435\u0433\u043e \u0432 sql.<br \/>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0437\u0430\u0432\u0451\u043b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Queryable \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0441\u0432\u043e\u0435\u043c\u0443 \u043a\u043e\u043b\u043b\u0435\u0433\u0435 \u0438\u0437 C#.<\/p>\n<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/58b\/2f5\/5d9\/58b2f55d9593f1e28b7c3d5e8e02cef9.png\" width=\"1627\" height=\"887\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/58b\/2f5\/5d9\/58b2f55d9593f1e28b7c3d5e8e02cef9.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u0441\u0434\u0435\u043b\u0430\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e\/\u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e sequence. \u0412 \u044d\u0442\u043e\u043c \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0435 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043b\u044f\u043c\u0431\u0434\u044b \u0438 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441 \u0438\u0445 AST. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u043b\u044f sql \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412 JOOQ \u0432\u0441\u0451 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u043e. \u041b\u044e\u0431\u043e\u0435 SELECT \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u201c\u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c\u201d \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u043a\u0430\u043a \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 (\u0432 SQL \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441). \u0427\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434, \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0442\u043b\u0438\u0447\u0438\u044f\u043c\u0438 \u043f\u043e\u0434 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u0421\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u0442\u0430\u043a\u0438\u0445 \u044f \u0432\u044b\u0434\u0435\u043b\u0438\u043b \u0442\u0440\u0438 &#8212; \u0432\u043e\u043d \u0442\u0430\u043c \u0432\u044b\u0448\u0435 \u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <code>DataView<\/code>. \u041e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0442\u0435\u043c, \u043a\u0430\u043a \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u0430\u0442\u044c AST \u043b\u044f\u043c\u0431\u0434, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 <code>it<\/code>.<\/p>\n<ul>\n<li>\n<p>\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0432 \u0431\u0430\u0437\u0435 (it == \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 Record);<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 (it == \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441);<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u043b\u0435\u043c (it == \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435).<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u0442 \u044d\u0442\u0438 \u0442\u0440\u0438 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"kotlin\">dsl.selectQueryableFrom(Tables.USERS) \/\/ \u0442\u0443\u0442 it - \u044d\u0442\u043e UserRecord, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 jooq-\u043e\u043c \u0438\u0437 \u0441\u0445\u0435\u043c\u044b \u0432 \u0431\u0430\u0437\u0435 \/\/ \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438 \u0441\u043e\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 .filter { it.age > 15 } .map { Pair(it.name, it.age) } \/\/ \u0442\u0443\u0442 it - \u044d\u0442\u043e \u0443\u0436\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 Pair, \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 jooq-\u043e\u0432\u0441\u043a\u0438\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \/\/ \u043d\u0430\u0434\u043e \u0433\u0434\u0435-\u0442\u043e \u201c\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c\u201d, \u0447\u0442\u043e second - \u044d\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 age .filter { it.second > 15 } .map { it.second } \/\/ \u0430 \u0442\u0443\u0442 it - \u044d\u0442\u043e \u0443\u0436\u0435 \u043e\u0434\u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0430 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 .filter { it > 15} <\/code><\/pre>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0431\u0435\u0433\u0443\u0441\u044c \u043f\u043e \u043c\u0435\u0442\u043e\u0434\u0430\u043c Queryable:<\/p>\n<ul>\n<li>\n<p><code>filter<\/code><\/p>\n<p>\u0422\u0443\u0442 AST \u0434\u0435\u0440\u0435\u0432\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b\u0445 \u043f\u0440\u0438\u043a\u0440\u0430\u0441. \u0420\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e \u043e\u0441\u043e\u0431\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 null-\u043e\u0432. <\/p>\n<pre><code class=\"kotlin\"> fun condition(node: Node): Condition {     val secondChildIsNull = (node is TwoChildren &amp;&amp; node.right == Value(null))     return when {     node is And -> condition(node.left).and(condition(node.right))     node is Or -> condition(node.left).or(condition(node.right))     node is Equal &amp;&amp; secondChildIsNull -> field&lt;Any>(node.left).isNull     node is Equal -> field&lt;Any>(node.left).eq(field&lt;Any>(node.right) as Field&lt;*>)     node is NotEqual &amp;&amp; secondChildIsNull -> field&lt;Any>(node.left).notEqual(field&lt;Any>(node.right) as Field&lt;*>)     node is Less -> field&lt;Any>(node.left).lessThan(field&lt;Any>(node.right) as Field&lt;*>)     node is LessOrEqual -> field&lt;Any>(node.left).lessOrEqual(field&lt;Any>(node.right) as Field&lt;*>)     node is Greater -> field&lt;Any>(node.left).greaterThan(field&lt;Any>(node.right) as Field&lt;*>)     node is GreaterOrEqual -> field&lt;Any>(node.left).greaterOrEqual(field&lt;Any>(node.right) as Field&lt;*>)     node is UnaryBang -> condition(node.child).not()     node is GetProperty     || node is Value     || node is Val     || node is Call     || node is LambdaArgument     -> field&lt;Any>(node).isTrue     else -> error(\"Cannot get conditions from $node\")      }  } <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 (jooq condition) \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u043f\u043e\u043b\u0435. SQL \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0432\u0440\u043e\u0434\u0435 <code>toList<\/code>, <code>count<\/code> \u0438 <code>aggregate<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>take<\/code> \/ <code>drop<\/code><\/p>\n<p>\u0422\u043e\u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u0436\u0435<\/p>\n<\/li>\n<li>\n<p><code>sortedBy<\/code><\/p>\n<p>\u0422\u0443\u0442 \u043d\u0430\u0434\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c AST \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041b\u043e\u0433\u0438\u043a\u0430 \u0442\u0443\u0442 \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u0430\u044f:<\/p>\n<pre><code class=\"kotlin\">fun &lt;T> field(node: Node): Field&lt;T> {     return when(node) {    is Unknown -> error(\"Impossible to use unknown node: ${node}\")    is UnaryMinus -> DSL.minus(field&lt;Number>(node))    is UnaryPlus -> field(node)    is UnaryBang -> DSL.not(field&lt;Boolean>(node))    is Plus -> field&lt;T>(node.left).plus(field&lt;T>(node.right))    is Minus -> field&lt;T>(node.left).minus(field&lt;T>(node.right))    is Multiply -> field&lt;Number>(node.left).mul(field&lt;Number>(node.right))    is Divide -> field&lt;Number>(node.left).div(field&lt;Number>(node.right))    is And, is Or -> error(\"Cannot use logical operations as fields\")    is Equal, is NotEqual, is Less,    is Greater, is GreaterOrEqual, is LessOrEqual,    -> error(\"Cannot use comparison operations as fields\")    is GetProperty -> when {    node.left is LambdaArgument -> nodeToJooq.field(node.right, node.left as LambdaArgument)    else -> error(\"Cannot parse $node\")    }    is Concat -> DSL.concat(*node.children.map { field&lt;String>(it) }.toTypedArray())    is Identifier -> dataView?.getField(node.name) ?: error(\"Unknown identifier ${node.name}\")    is Value -> DSL.value(node.value)    is LambdaArgument -> dataView?.getField() ?: nodeToJooq.field(node, node)    is Call -> call(node)    is Val -> DSL.value(node.value)    is Ref -> error(\"Cannot use references\")    is Error -> error(node.errorMessage)    } as Field&lt;T> } <\/code><\/pre>\n<\/li>\n<li>\n<p><code>sortedDescendingBy<\/code><\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c desc.<\/p>\n<\/li>\n<li>\n<p><code>map<\/code><\/p>\n<p>\u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f. \u0412 \u0442\u0435\u043e\u0440\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0438 \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 map \u0438\u0434\u0451\u0442 toList &#8212; \u043d\u0430\u0434\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043f\u0440\u043e\u0448\u0435\u043d\u043e. \u0422.\u0435. <code>queryable.map(fn).toList()<\/code> \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0432\u0435\u0440\u043d\u0443\u043b\u043e \u0431\u044b <code>queryable.toList().map(fn)<\/code>.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u043d\u0435 \u0437\u043d\u0430\u044e \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0435\u0448\u0438\u0442\u044c. \u0420\u0435\u0448\u0438\u043b \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432:<\/p>\n<ul>\n<li>\n<p>fn \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p>fn \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 data class, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 &#8212; \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u043e\u0442 \u0436\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 AST, \u0447\u0442\u043e \u0438 \u0434\u043b\u044f <code>sortedBy<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432 \u0438\u0442\u043e\u0433\u0435 sql \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u043e\u0434\u0438\u043d \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0414\u0430\u043b\u044c\u0448\u0435 \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c, \u0432\u0437\u044f\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0438 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0442\u0438\u043f \u043a \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e reflection \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u043a \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f \u0441 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 SQL \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0442 JOOQ \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>Record<\/code> \u0441 \u0442\u0435\u043c \u0436\u0435 \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u043e\u043b\u0435\u0439. \u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b <code>data class<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 <code>Record<\/code> \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"kotlin\">queryable   \/\/ \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b - name \u0438 age   \/\/ \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0442\u0438\u043f \u043a\u043b\u0430\u0441\u0441\u0430   .map { Pair(it.name, it.age) }      \/\/ \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e second - \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442   \/\/ \u0431\u044b\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u0434\u0432\u0430 \u043f\u043e\u043b\u044f - name \u0438 age   \/\/ \u0437\u043d\u0430\u0447\u0438\u0442 second == age   \/\/ \u0435\u0433\u043e \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 sql \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435   .filter { it.second > 18 }   \/\/ \u0442\u0443\u0442 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c SQL \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442 JOOQ \u043d\u0430\u0431\u043e\u0440 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432   \/\/ org.jooq.Record \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u043b\u044f\u043c\u0438   \/\/ \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e Record \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Pair \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c   \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430   .toList()<\/code><\/pre>\n<\/li>\n<li>\n<p><code>toList<\/code> \/ <code>count<\/code><\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f sql \u0437\u0430\u043f\u0440\u043e\u0441. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 <code>select<\/code> &#8212; \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439, \u0438\u043b\u0438 <code>count(*)<\/code><\/p>\n<\/li>\n<li>\n<p><code>aggregate<\/code><\/p>\n<p>\u041d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0435\u0440\u0435\u0447\u043d\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b \u0437\u0430\u0432\u0435\u0434\u0451\u043d \u0440\u0435\u0435\u0441\u0442\u0440 <s>\u0438\u043d\u043e\u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432<\/s> \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0438\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"kotlin\">registerAggregator(Iterable&lt;Int>::maxOrNull) { field -> DSL.max(field) } registerAggregator(Iterable&lt;Int>::minOrNull) { field -> DSL.min(field) } registerAggregator(Iterable&lt;Int>::sum) { field -> DSL.sum(field as Field&lt;out Number>?) } registerAggregator(Iterable&lt;Int>::average) { field -> DSL.avg(field as Field&lt;out Number>?) } <\/code><\/pre>\n<p>\u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438<\/p>\n<p><code>println(queryable.aggregate { it.sum() }) <\/code><\/p>\n<\/li>\n<\/ul>\n<h3>\u0413\u0434\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u044c<\/h3>\n<p>\u0412\u043e\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u0441\u0430\u043c\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c \u043a kotlin, <a href=\"https:\/\/github.com\/kotlinqs\/kotlinq\" rel=\"noopener noreferrer nofollow\"><u>\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0432 readme<\/u><\/a>.<\/p>\n<p>\u0412\u043e\u0442 <a href=\"https:\/\/github.com\/kotlinqs\/kotlinq-jooq\" rel=\"noopener noreferrer nofollow\"><u>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f jooq<\/u><\/a>.<\/p>\n<p>\u0418 \u0432\u043e\u0442 <a href=\"https:\/\/github.com\/kotlinqs\/kotlinq-jooq-example\" rel=\"noopener noreferrer nofollow\"><u>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c<\/u><\/a>.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c. \u041e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u201c\u0437\u0430\u043f\u0440\u043e\u0441\u201d \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0434\u043b\u044f \u0411\u0414.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"kotlin\">val report = storage.species()    .join(        storage.animals(),        { s, a -> s.id == a.speciesId },        { s, a -> AnimalDescription(s.name, a.name, a.population \/ Thousand) }    )    .sortedDescendingBy { it.popularityK }    .filter { it.popularityK > 0 }    .map { \"${it.speciesName.uppercase()}: ${it.animalName}  [${it.popularityK}K]\" }    .toList()    .joinToString(\"\\n\")<\/code><\/pre>\n<p>\u0418 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f SQL:<\/p>\n<pre><code class=\"sql\">select (((((upper(\"alias_28974773\".\"speciesName\") || ': ') || \"alias_28974773\".\"animalName\") || '  [') || cast(\"alias_28974773\".\"popularityK\" as varchar)) || 'K]') \"col0\"    from (select \"left\".\"NAME\" \"speciesName\", \"right\".\"NAME\" \"animalName\", (\"right\".\"POPULATION\" \/ 1000) \"popularityK\"            from \"PUBLIC\".\"SPECIES\" \"left\"            join \"PUBLIC\".\"ANIMALS\" \"right\"            on \"left\".\"ID\" = \"right\".\"SPECIES_ID\"    ) \"alias_28974773\"    where \"alias_28974773\".\"popularityK\" > 0    order by \"alias_28974773\".\"popularityK\" desc <\/code><\/pre>\n<h3>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/h3>\n<p>\u041d\u0435 \u0437\u043d\u0430\u044e. \u0421\u0432\u043e\u0451 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u0441\u0442\u0432\u043e \u044f \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u043b. \u041f\u043e\u043a\u0430\u0436\u0443 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c, \u0435\u0441\u043b\u0438 \u0438\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f &#8212; \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430\u0445. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 &#8212; \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u043f\u043e\u043b\u043d\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0438\u0445 \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b\u0445 \u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0411\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0412\u0441\u0435\u043c \u043c\u0438\u0440.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/669694\/\"> https:\/\/habr.com\/ru\/post\/669694\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption>\u042f \u0441\u043b\u044b\u0448\u0430\u043b, \u0442\u044b \u043b\u044e\u0431\u0438\u0448\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c kotlin&#8230;<\/figcaption><\/figure>\n<p>\u041d\u0430 kotlin \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u0430\u043c\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043a\u0443 <a href=\"https:\/\/jooq.org\" rel=\"noopener noreferrer nofollow\">JOOQ<\/a>. \u0423 \u043d\u0435\u0451 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0412\u043e\u0442 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"kotlin\">dsl.selectFrom(Tables.ANIMALS)    .where(Tables.ANIMALS.POPULATION.greaterThan(1000))    .orderBy(Tables.ANIMALS.NAME)    .map { \"${it.name}: ${it.population}\" }    .toList()<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043b\u0443\u0447\u0448\u0435? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 C# LINQ? <\/p>\n<p>\u0414\u0430, \u043c\u043e\u0436\u043d\u043e. \u0412\u043e\u0442 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"kotlin\">dsl.selectQueryableFrom(Tables.ANIMALS)    .filter { it.population > 1000 }    .sortedBy { it.name }    .map { \"${it.name}: ${it.population}\" }    .toList()<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 SQL \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0443 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430:<\/p>\n<pre><code class=\"sql\">select ((\"ANIMALS\".\"NAME\" || ': ') || cast(\"ANIMALS\".\"POPULATION\" as varchar)) \"col0\"    from \"ANIMALS\"    where \"ANIMALS\".\"POPULATION\" > 1000    order by \"ANIMALS\".\"NAME\" asc<\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 C#<\/h3>\n<p>\u0412\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430. \u0415\u0441\u0442\u044c 2 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0434\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <code>Func<\/code>, \u0434\u0440\u0443\u0433\u0430\u044f &#8212; <code>Expression<\/code>. \u0412 \u043e\u0431\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043b\u044f\u043c\u0431\u0434\u0443.<\/p>\n<pre><code class=\"cs\">internal class Program {  static void ReceiveLambda(Func&lt;int, int> lambda)  {    Console.WriteLine(lambda(2));    \/\/ (1)    Console.WriteLine(lambda);       \/\/ (2)  }   static void ReceiveExpression(Expression&lt;Func&lt;int, int>> lambda)  {    Console.WriteLine(lambda.Compile()(2));  \/\/ (1)    Console.WriteLine(lambda);               \/\/ (2)  }   public static void Main(string[] args)  {    ReceiveLambda(it => it * 2);    ReceiveExpression(it => it * 2);  } }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0443\u044e \u043b\u044f\u043c\u0431\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c (\u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043a <em>(1)<\/em>), \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c &#8212; \u0432\u044b\u0432\u0435\u0434\u0435\u0442\u0441\u044f 4.<br \/>\u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u0430\u043c\u0443 \u043b\u044f\u043c\u0431\u0434\u0443 (\u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043a <em>(2)<\/em>), \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f. \u041c\u0435\u0442\u043e\u0434, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 <code>Func<\/code>, \u0432\u044b\u0432\u0435\u0434\u0435\u0442<\/p>\n<p><code>System.Func`2[System.Int32,System.Int32]<\/code><\/p>\n<p>\u0410 \u043c\u0435\u0442\u043e\u0434, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 <code>Expression<\/code>, \u0432\u044b\u0432\u0435\u0434\u0435\u0442:<\/p>\n<p><code>it => (it * 2)<\/code><\/p>\n<p>\u0418 \u0432\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 C# \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 Expression, \u0442\u043e \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0430 <abbr title=\"Abstract Syntax Tree\" type=\"abbr\">AST<\/abbr>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u043b\u044f\u043c\u0431\u0434\u0443, \u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0438\u043c\u0435\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0442.\u0434. \u042d\u0442\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code class=\"cs\">\/\/Querying with LINQ to Entities  using (var context = new SchoolDBEntities()) {     var query = context.Students                        .where(s => s.StudentName == \"Bill\")                        .FirstOrDefault&lt;Student>(); }<\/code><\/pre>\n<p>\u0418 \u0434\u0430\u043b\u044c\u0448\u0435 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u0434 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0435\u0439 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0430\u043a \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 SQL.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u0442\u0443\u0442 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435: <a href=\"https:\/\/habr.com\/ru\/post\/256821\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/post\/256821\/<\/a><\/p>\n<p>\u0412 Kotlin\/JVM \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442. \u041b\u044f\u043c\u0431\u0434\u044b \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0438\u0445 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e. \u0414\u0430, \u0432 \u0442\u0435\u043e\u0440\u0438\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u043d\u043e \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430 \u0432 \u0441\u0438\u043b\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 kotlin:<\/p>\n<pre><code class=\"kotlin\">val a = maxOf(2, 3)<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u0438 \u0434\u0435-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 java (\u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438) \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"java\">byte var2 = 2; byte var3 = 3; final int a = Math.max(var2, var3);<\/code><\/pre>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u201c\u043f\u043e\u0442\u0435\u0440\u044f\u043b\u043e\u0441\u044c\u201d, \u0442.\u043a. \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>maxOf<\/code> \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0430 \u043a\u0430\u043a <code>inline<\/code>.<\/p>\n<p>\u0410 \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"kotlin\">val b = if (arrayOf(3).isEmpty()) 5 else 6<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"java\">Integer[] var2 = new Integer[]{3}; final int b = var2.length == 0 ? 5 : 6;<\/code><\/pre>\n<p>\u0414\u0430, \u044d\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b, \u043d\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0438\u0437 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430 \u043c\u044b 100% \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 kotlin \u043a\u043e\u0434\u0435. \u0410 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0432\u0438\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u043e\u0439, \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043e\u043d \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 AST.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0443\u0436\u043d\u043e:<\/p>\n<ol>\n<li>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u044c AST \u0438\u0437 \u043b\u044f\u043c\u0431\u0434\u044b \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c \u044d\u0442\u043e\u0442 AST \u0432 \u043a\u043e\u0434, \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0432 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043b\u044f\u043c\u0431\u0434\u043e\u0439<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.<\/p>\n<h3>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 AST \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/h3>\n<p>\u0411\u0435\u0433\u043b\u044b\u0439 \u0433\u0443\u0433\u043b\u0451\u0436 \u043d\u0430\u0448\u0451\u043b \u0434\u0432\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<br \/>\u041e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 &#8212; <a href=\"https:\/\/github.com\/cretz\/kastree\" rel=\"noopener noreferrer nofollow\"><u>kastree<\/u><\/a> &#8212; \u0437\u0430\u0431\u0440\u043e\u0448\u0435\u043d\u0430. \u0412\u0442\u043e\u0440\u0430\u044f &#8212; <a href=\"https:\/\/github.com\/kotlinx\/ast\" rel=\"noopener noreferrer nofollow\"><u>ast<\/u><\/a> &#8212;  \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0436\u0438\u0432\u043e\u0439. \u041f\u0440\u0438 \u043f\u043e\u0434\u0430\u0447\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e kotlin \u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"kotlin\">fun main() {    KotlinGrammarAntlrKotlinParser.parseKotlinFile(AstSource.String(\"\", \"\"\"        val d = { it > 5 }    \"\"\".trimIndent())).print() }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>kotlinFile   packageHeader   importList   topLevelObject     declaration       propertyDeclaration         VAL >>>val&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)         WS >>> &lt;&lt;&lt; (HIDDEN)         variableDeclaration           simpleIdentifier             Identifier >>>d&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)         WS >>> &lt;&lt;&lt; (HIDDEN)         ASSIGNMENT >>>=&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)         WS >>> &lt;&lt;&lt; (HIDDEN)         expression           disjunction             conjunction               equality                 comparison                   genericCallLikeComparison                     infixOperation                       elvisExpression                         infixFunctionCall                           rangeExpression                             additiveExpression                               multiplicativeExpression                                 asExpression                                   prefixUnaryExpression                                     postfixUnaryExpression                                       primaryExpression                                         functionLiteral                                           lambdaLiteral                                             LCURL >>>{&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)                                             WS >>> &lt;&lt;&lt; (HIDDEN)                                             statements                                               statement                                                 expression                                                   disjunction                                                     conjunction                                                       equality                                                         comparison                                                           genericCallLikeComparison                                                             infixOperation                                                               elvisExpression                                                                 infixFunctionCall                                                                   rangeExpression                                                                     additiveExpression                                                                       multiplicativeExpression                                                                         asExpression                                                                           prefixUnaryExpression                                                                             postfixUnaryExpression                                                                               primaryExpression                                                                                 simpleIdentifier                                                                                   Identifier >>>it&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)                                                           WS >>> &lt;&lt;&lt; (HIDDEN)                                                           comparisonOperator                                                             RANGLE >>>>&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)                                                           WS >>> &lt;&lt;&lt; (HIDDEN)                                                           genericCallLikeComparison                                                             infixOperation                                                               elvisExpression                                                                 infixFunctionCall                                                                   rangeExpression                                                                     additiveExpression                                                                       multiplicativeExpression                                                                         asExpression                                                                           prefixUnaryExpression                                                                             postfixUnaryExpression                                                                               primaryExpression                                                                                 literalConstant                                                                                   IntegerLiteral >>>5&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)                                             WS >>> &lt;&lt;&lt; (HIDDEN)                                             RCURL >>>}&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)     semis       EOF >>>&lt;EOF>&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)   EOF >>>&lt;EOF>&lt;&lt;&lt; (DEFAULT_TOKEN_CHANNEL)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u043e, \u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u043d\u043e. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u043b\u044f\u043c\u0431\u0434\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f.<\/p>\n<p>\u0412 \u0442\u0435\u043e\u0440\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u043a\u0430\u043a \u0435\u0441\u0442\u044c. \u041d\u043e \u043c\u043d\u0435 \u043e\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043c \u0435\u0433\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c. \u0425\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0430\u0441\u044c \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u0437 3\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0430\u043a \u0432 C#, \u0430 \u043d\u0435 300.<\/p>\n<p>\u041f\u043e\u0442\u0440\u0430\u0442\u0438\u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0443\u043f\u0440\u043e\u0449\u0430\u0442\u043e\u0440, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043b\u044f\u043c\u0431\u0434\u044b \u0432 \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0442 \u0434\u0435\u0440\u0435\u0432\u044c\u044f.<\/p>\n<pre><code>Greater(    LambdaArgument(number=0),     Value(value=5) ) <\/code><\/pre>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0448\u0435\u043d\u0430? \u041d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c. \u0427\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u0432 \u043b\u044f\u043c\u0431\u0434\u0430\u0445 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432?<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"kotlin\">val one = 1 val d = { it > one } <\/code><\/pre>\n<pre><code>Greater(    LambdaArgument(number=0),    Identifier(name=one) ) <\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043a\u043e\u0434\u0430, \u0442\u043e \u043c\u044b, \u0443\u0432\u044b, \u043d\u0435 \u0438\u043c\u0435\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438 \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u0430\u043a\u043e\u0439 \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u044f, \u0430 \u0447\u0442\u043e \u043e\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 &#8212; \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e. \u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0431\u044b\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0443 \u043d\u0430\u0441 \u044d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u0431\u044b. \u041d\u043e \u043c\u044b \u043f\u043e\u043a\u0430 \u0441\u043d\u0430\u0440\u0443\u0436\u0438.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u043e \u0432\u0441\u0451 \u043a\u0430\u043a \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0431\u0435\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430. \u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u043f\u043e\u0437\u0436\u0435. \u0410 \u043f\u043e\u043a\u0430 \u043f\u043e\u0439\u043c\u0451\u043c, \u043a\u0430\u043a \u043d\u0430\u043c \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435.<\/p>\n<p>\u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u0434\u0430<\/p>\n<p><code>filter { it > 5 }<\/code><\/p>\n<p>\u0421\u0442\u0430\u043b\u043e<\/p>\n<p><code>filter({it ><\/code><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-334120","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/334120","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=334120"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/334120\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=334120"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=334120"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=334120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}