{"id":324712,"date":"2021-06-10T15:00:31","date_gmt":"2021-06-10T15:00:31","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=324712"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=324712","title":{"rendered":"\u0412\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u2014 SQL \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0432 100 \u0441\u0442\u0440\u043e\u043a"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 <a href=\"https:\/\/habr.com\/ru\/company\/dbtc\/blog\/530564\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u044f \u043e\u043f\u0438\u0441\u0430\u043b \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438 \u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432. \u041d\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u0440\u0430\u0442\u043a\u043e \u0438 \u0441 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438. \u0412 \u0441\u0438\u043b\u0443 \u0441\u0432\u043e\u0435\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u044b \u0442\u0430\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0441\u043e\u0431\u043b\u0435\u043d\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 SQL \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440. \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043d\u0430 Rust. \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0441\u0442\u043e\u043b\u044c \u0432\u0435\u043b\u0438\u043a\u0438, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0432 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c select \u0441 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 100 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u0437\u0430 20 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<h2>\u041e\u0431\u0449\u0438\u0439 \u043f\u043b\u0430\u043d.<\/h2>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0446\u0435\u043b\u044c &#8212; \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"sql\">select * from (select sym,size,count(*),avg(price) into r   from bt where price&gt;10.0 and sym='fb'   group by sym,size)   as t1 join ref on t1.sym=ref.sym, t1.size = ref.size<\/code><\/pre>\n<p>\u0422.\u0435. \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u044c where \u0438 group by \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 &#8212; inner join \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u044f \u0432\u043e\u0437\u044c\u043c\u0443 <a href=\"https:\/\/www.kx.com\">Q<\/a>, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f &#8212; \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 \u043b\u0435\u043a\u0441\u0435\u0440\u0430, \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430. \u0414\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043c\u0435\u0441\u0442\u0430 \u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u0435\u0441\u0442\u0430, \u0430 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/quintanar401\/sql-demo\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0422\u0430\u043a \u0436\u0435 \u0434\u043b\u044f  \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e \u043b\u0438\u0448\u044c \u0447\u0430\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0431\u044b\u043b\u043e \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: join, where, group by, 3 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0442.\u043f.<\/p>\n<p>\u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445 \u043f\u0440\u0438\u0435\u043c\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445, &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u041f\u0430\u0440\u0441\u0435\u0440\u044b \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u0442 \u043d\u0435 \u0434\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0443\u043f\u043e\u0440 \u043d\u0430 Rust \u0438 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u043d\u0430 \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e-\u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0432\u043e\u044e \u0432\u0442\u043e\u0440\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u0441\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0435\u0440\u0435\u043d\u0435\u0441 \u0435\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u0442\u043e\u043c\u043b\u044f\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440. \u041d\u0430 Q \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b &#8212; \u0441\u0442\u0440\u043e\u043a 25. \u041d\u0430 Rust, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f. \u041d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e \u0448\u0430\u0433\u0430\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 Q, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u044f \u0438\u0445 \u043a \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 Rust.<\/p>\n<p>\u042d\u0442\u043e \u043c\u043e\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 Rust \u0438 \u0441\u0440\u0430\u0437\u0443 \u0445\u043e\u0447\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u043b\u0443\u0445\u0438 \u043e \u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u044b. \u0415\u0441\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435 (read only), \u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a Rust \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0437\u0430\u0431\u0440\u0430\u043a\u043e\u0432\u0430\u043b \u043c\u043e\u0438 \u0438\u0434\u0435\u0438, \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0435\u0433\u043e \u043e\u043d \u0445\u043e\u0447\u0435\u0442 \u0438 \u0443\u0436\u0435 \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c \u0438\u0437-\u0437\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0441\u0441\u044b\u043b\u043e\u043a, \u0430 \u044f\u0432\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0436\u0438\u0437\u043d\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u043f\u043e \u0434\u0435\u043b\u0443. \u0417\u0430\u0442\u043e \u0432\u0437\u0430\u043c\u0435\u043d \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u043f\u043e \u0449\u0435\u043b\u0447\u043a\u0443 \u043f\u0430\u043b\u044c\u0446\u0435\u0432. \u0427\u0442\u043e \u043c\u044b \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0435\u043d\u043e\u043c\u0435\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u0442\u043e\u043b\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>\u0412 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0412\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0443\u0442, \u0447\u0442\u043e \u0431\u0435\u0437 \u0440\u0430\u0437\u043d\u0438\u0446\u044b &#8212; \u043f\u0438\u0448\u0438\u0442\u0435 \u0432\u044b \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0438\u043b\u0438 \u043d\u0430 Rust, \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0435\u043b\u0430\u044e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043d\u0430 Q \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e \u0432 \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0440\u0430\u0437\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0441\u0430\u043c\u043e\u0433\u043e Q \u043d\u0430 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<h2>\u041b\u0435\u043a\u0441\u0435\u0440<\/h2>\n<p>\u0412\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432. \u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f fsa, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0438 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">fsa[state;char] -&gt; state<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e \u0432\u0441\u0435\u0439 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043b\u0435\u043a\u0441\u0435\u0440\u0430, \u0442.\u0435. \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u0430. \u0412\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043e\u0441\u043e\u0431\u044b\u0445 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u0442\u044c \u043f\u043e \u043d\u0438\u043c \u0432\u0445\u043e\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438. \u0421\u0445\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/619\/ca5\/5ea\/619ca55ea053d1ff53b867e51e274ef5.png\" width=\"1412\" height=\"742\"><figcaption><\/figcaption><\/figure>\n<p>\u0422.\u0435. \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u0430\u043f\u044b: <\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u0433\u0440\u0443\u043f\u043f\u044b (my.var -&gt; aa.aaa, 12.01 -&gt; 00.00, &#171;str 1&#187; -&gt; &#171;sss 1&#187; \u0438 \u0442.\u0434.).<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f. \u0417\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 fsa (aa.aaa -&gt; aAAAAA, 00.00 -&gt; 0IFFF, &#171;sss 1&#187; -&gt; &#171;SSSSSR).<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c (a, 0, &#187; \u0438 \u0442.\u0434.). \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432\u0441\u0435 \u043d\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0431\u0443\u043a\u0432\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0441\u0435 \u0442\u0440\u0438 \u044d\u0442\u0430\u043f\u0430 &#8212; \u044d\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 Q \u044d\u0442\u0430 \u0438\u0434\u0435\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 (\u0432\u0441\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0442\u0430\u043a, \u0447\u0442\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 limit):<\/p>\n<pre><code class=\"cpp\">(where fsa\\[start;input]&lt;limit)cut input<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0441\u044c \u043b\u0435\u043a\u0441\u0435\u0440. \u041f\u0440\u0430\u0432\u0434\u0430 \u0435\u0449\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c fsa. \u0412 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 fsa \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 &#8212; \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0438 \u0440\u0443\u043a\u0430\u043c\u0438, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 DSL. \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 (\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f ASCII \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b):<\/p>\n<pre><code class=\"cpp\">cgrp: (\"\\t \\r\\n\";\"0..9\";\"a..zA..Z\"),\"\\\\\\\"=&lt;&gt;.'\"; c2grp: 128#0; \/\/ \u043c\u0430\u0441\u0441\u0438\u0432 [0;128] \/\/ Q \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043b\u044e\u0431\u043e\u0439 \u0444\u043e\u0440\u043c\u044b. \/\/ \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432. \u0412 Rust \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u0432\u0430 \u044f\u0432\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430: \/\/ cgrp.iter().enumerate().for_each(|(i,&amp;s)| s.iter() \/\/   .for_each(|&amp;s| c2grp[s as usize] = i + 1)); c2grp[`int$cgrp]: 1+til count cgrp;<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u044f \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u0432\u0441\u0435 \u0446\u0438\u0444\u0440\u044b \u0438 \u0431\u0443\u043a\u0432\u044b. \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0446\u0438\u0444\u0440\u044b, \u0431\u0443\u043a\u0432\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u041c\u044b \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0438 \u0433\u0440\u0443\u043f\u043f\u044b \u0447\u0438\u0441\u043b\u0430\u043c\u0438 1, 2 \u0438 \u0442.\u0434., \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 0. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 c2grp:<\/p>\n<pre><code class=\"cpp\">c2grp `int$string<\/code><\/pre>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435(\u044f);\u0433\u0440\u0443\u043f\u043f\u0430(\u044b) \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432) -&gt; \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0414\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0433\u0440\u0443\u043f\u043f \u0438 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0433\u0440\u0443\u043f\u043f (\u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u044b 0..9 &#8212; 0, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440). \u0414\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 &#8212; \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u0443\u043a\u0432\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f \u0438\u043c\u0435\u043d \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>aA \u0410 a0.<\/code><\/pre>\n<p>\u0442.\u0435. \u0435\u0441\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445 &#171;a&#187; (\u043d\u0430\u0447\u0430\u043b\u043e \u0438\u043c\u0435\u043d\u0438) \u0438\u043b\u0438 &#171;A&#187; (\u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u043c\u0435\u043d\u0438), \u0438 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0437 \u0433\u0440\u0443\u043f\u043f [a,0,.], \u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 &#171;A&#187;. \u0412 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 &#171;a&#187; \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u0431\u0443\u043a\u0432\u0443 (\u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e). \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u043d \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u0431\u0443\u043a\u0432\u0443, \u0446\u0438\u0444\u0440\u0443 \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0443, \u0442\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 &#171;A&#187; \u0438 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043c \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b. \u042f \u0437\u0430\u043f\u0438\u0448\u0443 \u0432\u0441\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 (Rust):<\/p>\n<pre><code class=\"rust\">let rules: [&amp;[u8];21] =   [b\"aA A a0.\",                         \/\/ \u0438\u043c\u0435\u043d\u0430    b\"0I I 0\",b\"0I F .\",b\"F F 0\",        \/\/ int\/float    b\"= E =\",b\"&gt; E =\",b\"&lt; E =\",b\"&lt; E &gt;\", \/\/ &lt;&gt;, &gt;= \u0438 \u0442.\u043f.    b\"\\\" S *\",b\"S S *\",b\"\\\"S R \\\"\",      \/\/ \"str\"    b\"' U *\",b\"U U *\",b\"'U V '\",         \/\/ 'str'    b\"\\tW W \\t\"];                        \/\/ \u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b<\/code><\/pre>\n<p>\u0427\u0438\u0441\u043b\u0430 \u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u0434\u0430\u043d\u044b \u0432 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435. &#171;*&#187; \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 &#8212; \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b. \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u0443\u043a\u0432\u044b &#8212; \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u0422\u0430\u043a\u0430\u044f \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043b\u0435\u0433\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0442\u043e\u043a\u0435\u043d\u0430 &#8212; \u044d\u0442\u043e \u0432\u0441\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u0443\u043a\u0432\u044b.<\/p>\n<p>\u041c\u0430\u0442\u0440\u0438\u0446\u0430 fsa \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e. \u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>fsa[*;y] = y (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439) \"aA A a0.\" -&gt; \"aA\",\"A\",\"a0.\"; fsa[enc[\"aA\"];enc[\"a0.\"]] = enc[\"A\"] ...<\/code><\/pre>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 states:<\/p>\n<pre><code class=\"cpp\">states: distinct \" \",(first each cgrp),raze fsa[;1]; limit: 2+count cgrp; enc:states?; \/\/ \u0432 Q encode - \u044d\u0442\u043e \u043f\u043e\u0438\u0441\u043a \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u0435<\/code><\/pre>\n<p>\u0412\u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432\u0441\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (\u043f\u0440\u043e\u0431\u0435\u043b \u0434\u043b\u044f \u0443\u0447\u0435\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u044b 0), \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c limit.<\/p>\n<p>\u041a\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 fsa \u044f \u043e\u043f\u0443\u0441\u043a\u0430\u044e &#8212; \u043e\u043d \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u0445\u0435\u043c\u0435 \u0432\u044b\u0448\u0435.<\/p>\n<p>\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0430\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e lex. \u0412 \u043f\u0430\u0440\u0441\u0435\u0440\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0442\u044c \u0442\u0438\u043f \u0442\u043e\u043a\u0435\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u0438 \u0435\u0433\u043e \u0442\u043e\u0436\u0435. \u041d\u0430 Rust \u043b\u0435\u043a\u0441\u0435\u0440 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">let s2n = move |v| [\"ID\",\"NUM\",\"STR\",\"STR\",\"WS\",\"OTHER\"][find1(&amp;stn,&amp;v)]; move |s| {     if s.len()==0 {return Vec::&lt;Token&gt;::new()};     let mut sti = 0usize;     let st: Vec&lt;usize&gt; = s.as_bytes().iter().map(|b| { \/\/ st:fsa\\[0;c2grp x]         sti = fsa[sti][c2grp[std::cmp::min(*b as usize,127)]];         sti}).collect();     let mut ix: Vec&lt;usize&gt; = st.iter().enumerate() \/\/ ix:where st&lt;sta         .filter_map(|(i,v)| if *v&lt;sta {Some(i)} else {None}).collect();     ix.push(st.len());     (0..ix.len()-1).into_iter()         .filter_map(|i|             match s2n(st[ix[i]]) {                  \"WS\" =&gt; None,                   kind =&gt; Some(Token{ str:&amp;s[ix[i]..ix[i+1]], kind})              }).collect()<\/code><\/pre>\n<p>\u041d\u0430 Q \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0430\u0442\u043a\u043e:<\/p>\n<pre><code class=\"cpp\">s2n:(states?\"a0\\\"'\\t\")!(\"ID\";\"NUM\";\"STR\";\"STR\";\"WS\"); lex:{   i:where (st:fsa\\[0;c2grp x])&lt;limit;   {x[;where not \"WS\"~\/: x 0]} (s2n st i;i cut x)};<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0435\u043a\u0441\u0435\u0440, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<pre><code class=\"cpp\">lex \"10 + a0\" -&gt; ((\"NUM\";\"\";\"ID\");(\"10\";\"+\";\"a0\"))<\/code><\/pre>\n<h2>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440<\/h2>\n<p>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438 &#8212; \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 select. \u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430 \u043d\u0430 Q, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u043e\u0434\u0430 \u043d\u0430 Rust. \u042f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a \u0432 \u0446\u0435\u043b\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440. \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0438\u0442 enum Val:<\/p>\n<pre><code class=\"rust\">type RVal=Arc&lt;Val&gt;;\t enum Val {        I(i64),     D(f64),     II(Vec&lt;i64&gt;),     DD(Vec&lt;f64&gt;),     S(Arc&lt;String&gt;),     SS(Vec&lt;Arc&lt;String&gt;&gt;),     TBL(Dict&lt;RVal&gt;),     ERR(String), }<\/code><\/pre>\n<p>\u0415\u0441\u0442\u044c \u0442\u0440\u0438 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 &#8212; \u0441\u0442\u0440\u043e\u043a\u0438, \u0446\u0435\u043b\u044b\u0435 \u0438 \u043d\u0435\u0446\u0435\u043b\u044b\u0435, \u0434\u0432\u0435 \u0444\u043e\u0440\u043c\u044b \u0438\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f &#8212; \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0430\u044f \u0438 \u0432\u0435\u043a\u0442\u043e\u0440. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u043e\u0448\u0438\u0431\u043a\u0438. Dict &#8212; \u044d\u0442\u043e \u043f\u0430\u0440\u0430 Vec&lt;String&gt; \u0438 Vec&lt;T&gt; \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b T = Vec&lt;RVal&gt;, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 Val &#8212; \u044d\u0442\u043e II, DD \u0438\u043b\u0438 SS. Rust \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432 \u043b\u0435\u0433\u043a\u0443\u044e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u0435\u043b\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043d\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438.  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u043e\u0431\u0435\u0440\u043d\u0443\u043b \u0432\u0441\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a Arc. \u0421\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u044d\u0442\u043e \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438:<\/p>\n<pre><code class=\"rust\">enum Expr {     Empty,     F1(fn (RVal) -&gt; RRVal, Box&lt;Expr&gt;), \/\/ f(x)     F2(fn (RVal,RVal) -&gt; RRVal, Box&lt;Expr&gt;, Box&lt;Expr&gt;), \/\/ f(x,y)     ELst(Vec&lt;Expr&gt;),     ID(String),  \/\/ variable\/column     Val(Val),    \/\/ simple value - 10, \"str\"     Set(String,Box&lt;Expr&gt;), \/\/ 'set var expr' - assignment     Sel(Sel),\t \/\/ select     Tbl(Vec&lt;String&gt;,Vec&lt;Expr&gt;), \/\/ [c1 expr1, c2 expr2] - create table  }<\/code><\/pre>\n<p>ELst \u0438 Empty \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u043c. Expr (\u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0435\u0431\u044f) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043a\u0443\u0447\u0435 (Box). \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 eval \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u0433\u0434\u0435 \u0437\u0430\u0434\u0430\u043d\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 (Set), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b:<\/p>\n<pre><code class=\"rust\">struct ECtx {     ctx: HashMap&lt;String,Arc&lt;Val&gt;&gt;,   \/\/ variables } struct SCtx {     tbl: Arc&lt;Table&gt;,                \/\/ within select     idx: Option&lt;Vec&lt;usize&gt;&gt;,        \/\/ idx into tbl     grp: Arc&lt;Vec&lt;String&gt;&gt;,          \/\/ group by cols }<\/code><\/pre>\n<p>eval \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430 (self = ECtx):<\/p>\n<pre><code class=\"rust\">type RRVal=Result&lt;Arc&lt;Val&gt;,String&gt;; fn top_eval(&amp;mut self, e: Expr) -&gt; RRVal {     match e {         Expr::Set(id,e) =&gt; {             let v = self.eval(*e, None)?;             self.ctx.insert(id,v.clone()); Ok(v)},         Expr::Sel(s) =&gt; self.do_sel(s),         _ =&gt; self.eval(e, None)     } } fn eval(&amp;self, e: Expr, sctx:Option&lt;&amp;SCtx&gt;) -&gt; RRVal {     match e {         Expr::ID(id) =&gt; self.resolve_name(sctx,&amp;id),         Expr::Val(v) =&gt; Ok(v.into()),         Expr::F1(f,e) =&gt; Ok(f(self.eval(*e,sctx)?)?),         Expr::F2(f,e1,e2) =&gt; Ok(f(self.eval(*e1,sctx)?,self.eval(*e2,sctx)?)?),         Expr::Tbl(n,e) =&gt; { self.eval_table(None,n,e) }         e =&gt; Err(format!(\"unexpected expr {:?}\",e))     } }<\/code><\/pre>\n<p>Set \u0438 Sel \u043d\u0443\u0436\u0435\u043d \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0430 \u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 eval \u0440\u0430\u0437\u0431\u0438\u0442 \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438. \u0417\u0430\u0434\u0430\u0447\u0430 resolve_name &#8212; \u043d\u0430\u0439\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438\u043b\u0438 \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c where \u0438\u043d\u0434\u0435\u043a\u0441. eval_table &#8212; \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u0437 \u0447\u0430\u0441\u0442\u0435\u0439 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0441 \u043d\u0435\u0439 \u0432\u0441\u0435 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 (\u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u043e\u0434\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u0438 \u0442.\u043f.). \u0424\u0443\u043d\u043a\u0446\u0438\u0438 F1 (max, count &#8230;) \u0438 F2 (+, &gt;=, &#8230;) \u0441\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c match \u0431\u043b\u043e\u043a\u0430\u043c, \u0433\u0434\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f. \u041c\u0430\u043a\u0440\u043e\u0441\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0430\u0441\u0442\u044c match \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">(Val::D(i1),Val::I(i2)) =&gt; Ok(Val::D($op(*i1,*i2 as f64)).into()), (Val::D(i1),Val::D(i2)) =&gt; Ok(Val::D($op(*i1,*i2)).into()), (Val::I(i1),Val::II(i2)) =&gt; Ok(Val::II(i2.par_iter()     .map(|v| $op(*i1,*v)).collect()).into()),<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0430 100 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a, \u044d\u0442\u043e \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043d\u0438 \u043c\u0430\u043b\u0435\u0439\u0448\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412\u0438\u0434\u0438\u0442\u0435 \u0441\u043b\u043e\u0432\u043e par_iter \u0432\u044b\u0448\u0435? \u042d\u0442\u043e \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 Rust, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u043b\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439. <\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 select \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0435\u0433\u043e \u043d\u0430 Q, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u0434 \u043d\u0430 Rust \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u043a\u043e\u0434 \u043d\u0430 Q, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e\u0439.<\/p>\n<p>Select \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043f\u043e\u0434\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 (join, where, group, select, distinct, into), \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u0421\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u0438\u0437 \u043d\u0438\u0445 &#8212; join. \u0412 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f rename, \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u043e \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430 \u043f\u0440\u0438 join:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0435\u0441\u043b\u0438 x \u044d\u0442\u043e name -&gt; \u043d\u0430\u0439\u0442\u0438, select -&gt; \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c sget:{[x] $[10=type x;get x;sel1 x]}; \/\/ \u0432 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a '(ID|sel) (\"as\" ID)?' \/\/ \u0442\u0430\u043a \u0447\u0442\u043e x \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: (ID \u0438\u0437 as \u0438\u043b\u0438 \u0438\u043c\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b;ID\/select) \/\/ y - \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 rename:{[x;y]   t:sget x 1; \/\/ \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443: names!vals   k:(k!v),(n,\/:k)!v:(y,n:x[0],\".\"),\/:k:key t; \/\/ k - \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430,         \/\/ v - \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435, n - \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c (table.name)   (k;v!value t)};<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u044d\u0442\u0438 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044e \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 &#8212; \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438\u043c\u0435\u043d \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0445 (table.name) \u0432 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0438\u0437 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043c\u0435\u043d \u0432 \u0441\u0430\u043c\u0438 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u043c\u0435\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u0439 join \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u0438\u043c \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u0447\u0435\u0440\u0435\u0437 \u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0441 \u0442\u043e\u0447\u043a\u043e\u0439.<\/p>\n<p>\u0412 \u043e\u0441\u043d\u043e\u0432\u0435 join \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">\/\/ x - \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 rename \/\/ y - \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0432 \u044d\u0442\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \/\/ z - join \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0441\u043f\u0438\u0441\u043e\u043a (\u043a\u043e\u043b\u043e\u043d\u043a\u0430 \u0432 x;\u0438 \u0432 y) \/\/ \u0443\u0441\u043b\u043e\u0432\u0438\u0435 join: x[z[i;0]]==y[z[i;1]] \u0434\u043b\u044f \u0432\u0441\u0435\u0445 i join_core:{[x;y;z]   \/\/ m - \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d \u0432 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b x+y   \/\/ \u0438\u043c\u0435\u043d\u0430 \u0438\u0437 x \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442   \/\/ c - \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c join \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0432 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430   c:(m:y[0],x 0)z;   \/\/ \u043f\u043e\u0441\u043b\u0435 join z[;0] \u0438 z[;1] \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438   \/\/ \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0438\u0437 y \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u043c \u043d\u0430 x   m[z[;1]]:c[;0];   \/\/ x[1]c[;0] - \u043f\u0440\u043e\u0441\u0442\u043e join \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b x (\u043f\u043e\u0434\u0442\u0430\u0431\u043b\u0438\u0446\u0430)   \/\/ y[1]c[;1] - \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e \u0438\u0437 y   \/\/ sij[xval;yval] -&gt; (idx1;idx2) \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b join \u0432 \u043e\u0431\u0435\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445   \/\/ sidx[(i1;i2);x;y \u0431\u0435\u0437 join \u043a\u043e\u043b\u043e\u043d\u043e\u043a] -   \/\/  \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u0437 x \u0438 y \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432   (m;sidx[sij[x[1]c[;0];y[1]c[;1]];x 1;c[;1]_ y 1])} \/\/ sidx \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043a\u043e \u0432\u0441\u0435\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 y \u0438 z \/\/ y z - \u044d\u0442\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u0438, \u043d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043c\u0435\u044e\u0442 \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0448\u0438\u0440\u043e\u043a\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u044f\u0432\u043d\u043e \u043a value  sidx:{(y@\\:x 0),z@\\:x 1};<\/code><\/pre>\n<p>\u0412\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 sij, \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 &#8212; \u044d\u0442\u043e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438, \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c\u0438  \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0438\u043f \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 sij. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 80% select, \u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f sij \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043f\u043e\u0438\u0441\u043a\u0443 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b x \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 y. \u0412 Rust \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c HashMap \u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 hash \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 FNV &#8212; \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 Map \u043e\u0434\u043d\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u0442\u043e\u0440\u043e\u0439. \u0412 Q, \u0441\u0443\u0434\u044f \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435. \u0412 \u0446\u0435\u043b\u043e\u043c \u0432 Q \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0438\u043b\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438. \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0432\u0441\u0435 \u043f\u043e-\u0447\u0435\u0441\u0442\u043d\u043e\u043c\u0443:<\/p>\n<pre><code class=\"cpp\">\/\/ x \u0438 y - \u0441\u043f\u0438\u0441\u043a\u0438 \u043a\u043e\u043b\u043e\u043d\u043e\u043a sij:{j:where count[y 0]&gt;i:$[1=count x;y[0]?x 0;flip[y]?flip x]; (j;i j)}; \/\/ \u0438\u043b\u0438 \u043d\u0430 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0435 \/\/ i=find_idx[tblY;tblX]; j=i where not null i; return (j,i[j])<\/code><\/pre>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u0435 (?) \u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b (flip). \u042d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f &#8212; \u0432\u0441\u0435\u0433\u043e \u0432 2.5 \u0440\u0430\u0437\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0440\u0430\u0437\u0443 \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a\u0436\u0435 &#8212; x?y, \u0442\u043e\u043b\u044c\u043a\u043e x \u0438 y &#8212; \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0430 \u043d\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432). \u042d\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u0441\u0438\u043b\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432.<\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u0441\u0430\u043c join &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0446\u0438\u043a\u043b \u0441\u0432\u0435\u0440\u0442\u043a\u0438 \u043f\u043e \u0432\u0441\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c (fold):<\/p>\n<pre><code class=\"cpp\">\/\/ \"\/\" \u044d\u0442\u043e fold, rename' \u044d\u0442\u043e map(rename) sjoin:{[v] join_core\/[rename[v 0;\"@\"];rename'[v 1;string til count v 1];v 2]};<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 select \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435. where:<\/p>\n<pre><code class=\"cpp\">swhere:{[t;w] i:til count value[t 1]0;  \/\/ \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e   $[count w;where 0&lt;&gt;seval[t;i;();w];i]}; \/\/ \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 0 \/\/ seval \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043a\u0430\u043a eval \u0432 Rust, \u0442.\u0435. \u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430: \/\/ seval[table,index;group by cols;expr], ECtx - \u044d\u0442\u043e \u0441\u0430\u043c Q<\/code><\/pre>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f select:<\/p>\n<pre><code class=\"cpp\">sel2:{[p] \/\/ p ~ \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 select (`j, `s, `g  \u0438 \u0442.\u043f.)   i:swhere[tbl:sjoin p`j;p`w]; \/\/ \u0441\u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430\u0435\u043c join \u0438 where   if[0=count p`s; \/\/ \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 select * \u043d\u0430\u0434\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c     rmap:v[vi]!key[tbl 0] vi:v?distinct v:value tbl 0;     p[`s]:{nfix[x]!x} rmap key tbl 1];   if[count p`g; \/\/ group by     \/\/ \u0438\u0437 group \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0438\u0445 \u0438\u043c\u0435\u043d\u0430     gn:nfix {$[10=type x;x;\"\"]} each p`g;     \/\/ sgrp \u0432\u0435\u0440\u043d\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 (idx1;idx2;..) \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b     \/\/ \u0437\u0430\u0442\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c seval[tbl;idxN;gn;exprM] \u0434\u043b\u044f \u0432\u0441\u0435\u0445 idx+expr     \/\/ \u0442.\u0435. \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 Q \u0441\u043a\u0440\u044b\u0442 \u0437\u0430 \u0434\u0432\u0443\u043c\u044f \"each\"     g:sgrp[tbl;i;p`g]];     :key[p`s]!flip {x[z] each y}[seval[tbl;;gn];value p`s] each g;   \/\/ \u0435\u0441\u043b\u0438 group \u043d\u0435\u0442, \u0442\u043e \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e - \u043f\u0440\u043e\u0441\u0442\u043e seval \u0434\u043b\u044f \u0432\u0441\u0435\u0445 select \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439   (),\/:seval[tbl;i;()] each p`s  };<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f sgrp \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 group by &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 group, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447\u0438 &#8212; \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f &#8212; \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438:<\/p>\n<pre><code>sgrp:{[t;i;g] i value group flip seval[t;i;()] each g};<\/code><\/pre>\n<p>\u042f \u043e\u043f\u0443\u0441\u043a\u0430\u044e distinct \u0438 into \u0447\u0430\u0441\u0442\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0438 \u043c\u0430\u043b\u043e\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b.  \u0412 \u0446\u0435\u043b\u043e\u043c &#8212; \u044d\u0442\u043e \u0432\u0435\u0441\u044c select \u043d\u0430 Q. \u0412 \u043a\u0440\u0430\u0442\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 25 \u0441\u0442\u0440\u043e\u043a. \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0436\u0434\u0430\u0442\u044c \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0442\u043e\u043b\u044c \u0441\u043a\u0440\u043e\u043c\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b? \u0414\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435! <\/p>\n<h2>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h2>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440  \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430<\/p>\n<pre><code class=\"sql\">select * from (select sym,size,count(*),avg(price) into r   from bt where price&gt;10.0 and sym='fb'   group by sym,size)   as t1 join ref on t1.sym=ref.sym, t1.size = ref.size<\/code><\/pre>\n<p>\u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0432 \u0441\u043e\u0442\u043d\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 bt \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0432\u044b\u0448\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c:<\/p>\n<pre><code>\/\/ \u0432 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0435 \u043d\u0430 Rust \/\/ s = (\"apple\";\"msft\";\"ibm\";\"bp\";\"gazp\";\"google\";\"fb\";\"abc\") \/\/ i\/f - i64\/f64 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b [0-100) set bt [sym rand('s',100000000), size rand('i', 100000000),     price rand('f', 100000000)]<\/code><\/pre>\n<p>\u0422.\u0435. \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 100 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a.  \u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 select \u0441 group by (\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f 800 \u0433\u0440\u0443\u043f\u043f \u043f\u043e ~125000 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)<\/p>\n<pre><code class=\"sql\">select sym,size,count(*),avg(price) into r from bt group by sym,size<\/code><\/pre>\n<p>\u0440\u0430\u0431\u043e\u0442\u0430\u043b 44 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0430 Rust, \u0447\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0438 \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u0435\u043b\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 6 \u0441\u0435\u043a\u0443\u043d\u0434. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u0435\u0441\u044c\u043c\u0430 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043b\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. <\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 Rust, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0432\u043e\u0439 \u0432\u043d\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0434, &#8212; \u044d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 1 \u0432 1 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 Q. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u0438 \u0434\u0430\u0436\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043e\u043d\u0430 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430. \u0422\u0430\u043a\u0436\u0435 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0435\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043f\u0443\u0442\u0435\u043c \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 &#8212; \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438, \u0442\u043e \u0432\u0441\u0435 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e &#8212; \u044d\u0442\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043c \u0438 \u0442\u0443\u0442 par_iter \u0432\u043c\u0435\u0441\u0442\u043e iter.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043d\u0430 Q \u043d\u0435 \u0441\u0442\u043e\u043b\u044c \u0431\u044b\u0441\u0442\u0440, \u043d\u043e \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 select \u0432\u0441\u0435\u0433\u043e \u043d\u0430 50% \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c Q. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 Q \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u0441\u0442\u0440\u043e, \u043a\u0430\u043a \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u044f\u0437\u044b\u043a\u0435.<\/p>\n<p>\u0425\u043e\u0447\u0443 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0442\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u044f\u0432\u0438\u043b \u0441\u0435\u0431\u044f Rust. \u0417\u0430 \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u044f \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e segfault \u0438 \u0434\u0430\u0436\u0435 panic \u0443\u0432\u0438\u0434\u0435\u043b \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u0438 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u0440\u0430\u0436\u0430\u0435\u0442, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0433\u043a\u043e \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0432 \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443. <\/p>\n<h2>\u041f\u0430\u0440\u0441\u0435\u0440<\/h2>\n<p>\u042f \u043e\u0442\u043b\u043e\u0436\u0438\u043b \u043f\u0430\u0440\u0441\u0435\u0440 \u043d\u0430 \u043a\u043e\u043d\u0435\u0446, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u0435\u043c\u0435\u043d \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a \u0442\u0435\u043c\u0435 \u0441\u0442\u0430\u0442\u044c\u0438. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435 \u043d\u0430 Rust. <\/p>\n<p>\u042d\u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u0431\u0435\u0437 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u043d\u0438\u044f \u0432\u043f\u0435\u0440\u0435\u0434. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u0438 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b. \u0422\u0430\u043a\u043e\u0439 \u043f\u0430\u0440\u0441\u0435\u0440, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u0438 \u043d\u0435 \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043d\u043e \u0434\u043b\u044f SQL \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u043d\u0435 \u043d\u0430\u0434\u043e. \u041a\u0430\u043a\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430, \u043f\u0430\u0440\u0441\u0438\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 1 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0438\u043b\u0438 10, \u0435\u0441\u043b\u0438 \u0441\u0430\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0437\u0430\u0439\u043c\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0441\u043e\u0442\u043d\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p>\u0422\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u044b \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u0448\u0443\u0442 \u0440\u0443\u043a\u0430\u043c\u0438, \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043e\u043d\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code>parse_expr1(..) {    if(success(parse_expr2(..)) {     if (success(parse_str(\"+\") || success(parse_str(\"-\")) {       if(success(parse_expr1(..)) {          return &lt;expr operation expr&gt;       }       return Fail     }     return &lt;expr&gt;   }   return Fail; }<\/code><\/pre>\n<p>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0441\u0435 \u0440\u0443\u043a\u0430\u043c\u0438, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u0438\u0437 BNF-\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b. \u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 BNF \u043f\u0438\u0448\u0435\u043c \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u0442\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0438\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0441\u044f\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0438 \u0432\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e. \u0412 Rust, \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b. \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0442\u0438\u043f\u044b \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u044f\u0449\u0438\u0445 \u0438 post process \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"rust\">type ParseFn = Box&lt;dyn Fn(&amp;PCtx,&amp;[Token],usize) -&gt; Option&lt;(Expr,usize)&gt;&gt;; type PPFn = fn(Vec&lt;Expr&gt;) -&gt; Expr;<\/code><\/pre>\n<p>ParseFn \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\u043c (closure) \u0438 \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u043a\u0443\u0447\u0435. PCtx \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 ParseFn \u0434\u043b\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438 PPFn \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0435\u0440\u0435\u0432\u0430. \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043d\u0435 \u0443\u0434\u0430\u043b\u0441\u044f, \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 None, \u0438\u043d\u0430\u0447\u0435 Some \u0441 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0438 \u043d\u043e\u0432\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. PPFn \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0443\u0437\u0435\u043b \u0434\u0435\u0440\u0435\u0432\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u0435\u0437\u043b\u0438\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u043d\u0443\u0436\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435. <\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0447\u0430\u0441\u0442\u044c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"rust\">(\"expr\", \"expr1 ('or' expr {lst})? {f2}\"), (\"expr1\",\"'not' expr1 {f1} | expr2 ('and' expr1 {lst})? {f2}\"), (\"expr2\",\"expr3 (('='|'&lt;&gt;'|'&lt;='|'&gt;='|'&gt;'|'&lt;') expr2 {lst})? {f2}\"), (\"expr3\",\"expr4 (('+'|'-') expr3 {lst})? {f2}\"), (\"expr4\",\"vexpr (('*'|'\/') expr4 {lst})? {f2}\"), (\"vexpr\",\"'(' expr ')' {2} | '-' expr {f1} | call | ID | STR | NUM |   '[' (telst (',' telst)* {conc}) ']' {tblv}\"), (\"call\", \"('sum'|'avg'|'count'|'min'|'max') '(' expr ')' {call} |   'count' '(' '*' ')' {cnt} | 'rand' '(' STR ',' NUM ')' {rand}\"),<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0432\u0438\u0434\u043d\u044b \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 &#8212; \u0438\u043c\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0441\u0430\u043c\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0438 PP \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445. \u041a\u0430\u0436\u0434\u0430\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 PP \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Expr, \u0430 \u043d\u0435 Vec&lt;Expr&gt;. PP \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0435-\u0433\u0434\u0435 PP \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0435\u0442. ID, NUM \u0438 \u0442.\u043f. \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f ParseFn \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c.<\/p>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0448 \u043f\u0430\u0440\u0441\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"rust\">let parse = |str| {     let t = l(str);  \/\/ add ({}) depth map     let mut lvl = 0;     pp_or(&amp;t.into_iter().map(|v| {       match v.str.as_bytes()[0] {         b'(' | b'{' =&gt; lvl+=1,         b')' | b'}' =&gt; lvl-=1,         _ =&gt; ()};       (v,std::cmp::max(0,lvl))}).collect::&lt;Vec&lt;(Token,i32)&gt;&gt;()     , 0) };<\/code><\/pre>\n<p>l &#8212; \u044d\u0442\u043e \u043b\u0435\u043a\u0441\u0435\u0440, \u044f \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043b\u0435\u043a\u0441\u0435\u0440 SQL. \u041d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u043a\u043e\u0431\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c BNF \u043f\u043e\u0434\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043f\u0430\u0440\u0441\u0435\u0440 \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439, \u0442\u043e \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u043e\u0431\u043e\u043a, \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e \u0433\u043b\u0443\u0431\u0438\u043d\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438 \u0442.\u043f.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0448\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u043f\u0430\u0440\u0441\u0435\u0440 BNF. \u041d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>or \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; A | B<\/p>\n<\/li>\n<li>\n<p>and \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; A B C<\/p>\n<\/li>\n<li>\n<p>const \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; &#171;(&#171;, &#171;select&#187;.<\/p>\n<\/li>\n<li>\n<p>token \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212;  NUM, STR.<\/p>\n<\/li>\n<li>\n<p>subrule \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; expr1, call.<\/p>\n<\/li>\n<li>\n<p>optional \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; A?<\/p>\n<\/li>\n<li>\n<p>0+ \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; A*<\/p>\n<\/li>\n<li>\n<p>1+ \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; A+<\/p>\n<\/li>\n<li>\n<p>PP \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; {ppfn}<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0430\u044f \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, or \u043f\u0440\u0430\u0432\u0438\u043b\u043e:<\/p>\n<pre><code class=\"rust\">fn pp_or(t: &amp;[(Token,i32)], lvl:i32) -&gt; ParseFn {     if t.len() == 0 {return Box::new(|_,_,i| Some((Expr::Empty,i)))};     let mut r: Vec&lt;ParseFn&gt; = t       .split(|(v,i)| *i == lvl &amp;&amp; v.str.as_bytes()[0] == b'|' )       .map(|v| pp_and(v,lvl)).collect();     if 1 == r.len() {         r.pop().unwrap()     } else {         Box::new(move |ctx,toks,idx|           r.iter().find_map(|f| f(ctx,toks,idx)))     } }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u044c ParseFn \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435. \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 pp_and \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e ParseFn, \u043d\u0443\u0436\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0438\u043a\u043b \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u0434\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u043a\u0430 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435 \u0432\u0435\u0440\u043d\u0435\u0442 Some.<\/p>\n<p>pp_and \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0435 \u0435\u0435 \u043f\u043e\u0434\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c Some. \u0422\u0430\u043a\u0436\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u0430 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e PPFn \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.<\/p>\n<pre><code class=\"rust\">fn pp_and(t: &amp;[(Token,i32)], lvl:i32) -&gt; ParseFn {     if t.len() == 0 {return Box::new(|_,_,i| Some((Expr::Empty,i)))};     let (rules,usr) = pp_val(Vec::&lt;ParseFn&gt;::new(),t,lvl);     Box::new(move |ctx,toks,i| {         let mut j = i;         let mut v = Vec::&lt;Expr&gt;::with_capacity(rules.len());         for r0 in &amp;rules {         \t\tif let Some((v0,j0)) = r0(ctx,toks,j) {             \t\tj = j0; v.push(v0)             } else {return None} };         Some((ctx.ppfns[&amp;usr](v),j))     }) }<\/code><\/pre>\n<p>pp_val \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u0440\u0443\u0433\u043b\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438 \u0438 \u0432\u0441\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0437 \u043d\u0435\u0435:<\/p>\n<pre><code class=\"rust\">\/\/ Token - if ok call rules[Token] move |ctx,tok,i| if i&lt;tok.len() &amp;&amp; tok[i].kind == s    {ctx.rules[&amp;s](ctx,tok,i)} else {None} \/\/ Subrule move |ctx,tok,i| ctx.rules[&amp;s](ctx,tok,i))} \/\/ rule? move |ctx,tok,i| Some(rule(ctx,tok,i).unwrap_or((Expr::Empty,i))) \/\/ rule+ move |ctx,tok,i| {     let (e,i) = plst(&amp;rule,ctx,tok,i);     if 0&lt;e.len() {Some((Expr::ELst(e),i))} else {None}} \/\/ \u0433\u0434\u0435 plst let mut j = i; let mut v:Vec&lt;Expr&gt; = Vec::new(); while let Some((e,i)) = rule(ctx,tok,j) {j=i; v.push(e)}; (v,j)<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430. \u0427\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c parse \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432 map:<\/p>\n<pre><code class=\"rust\">let mut map = HashMap::new(); map.insert(\"expr\".to_string(), parse(\"expr1 ('or' expr {lst})? {f2}\")); ...  <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c PP \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043e\u043d\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b:<\/p>\n<pre><code class=\"rust\">let mut pfn: HashMap&lt;String,PPFn&gt; = HashMap::new(); \/\/ default rule pfn.insert(\"default\".to_string(),|mut e| e.pop().unwrap()); \/\/ set name expr \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 pfn.insert(\"set\".to_string(),|mut e| Expr::Set(e.swap_remove(1).as_id(),   e.pop().unwrap().into()) );<\/code><\/pre>\n<p>\u0412 Rust \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 swap_remove, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e.<\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0434\u043b\u044f \u043d\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e parse:<\/p>\n<pre><code class=\"rust\">PCtx { rules:map, ppfns:pfn} ... impl PCtx {     fn parse(&amp;self, t:&amp;[Token]) -&gt; Expr {         if let Some((e,i)) = self.rules[\"top\"](&amp;self,t,0) {             if i == t.len() {e}               else {Val::ERR(\"parse error\".into()).into()}         } else {Val::ERR(\"parse error\".into()).into()}     } }<\/code><\/pre>\n<p>\u0412\u0441\u0435, \u043f\u0430\u0440\u0441\u0435\u0440 \u0433\u043e\u0442\u043e\u0432. \u041e\u043d \u043d\u0435 \u0431\u044b\u0441\u0442\u0440, \u043d\u043e \u0437\u0430\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442. \u041f\u043b\u044e\u0441 \u043e\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 &#8212; \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. <\/p>\n<\/div>\n<p> \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\/company\/dbtc\/blog\/552852\/\"> https:\/\/habr.com\/ru\/company\/dbtc\/blog\/552852\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 <a href=\"https:\/\/habr.com\/ru\/company\/dbtc\/blog\/530564\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u044f \u043e\u043f\u0438\u0441\u0430\u043b \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438 \u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432. \u041d\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u0440\u0430\u0442\u043a\u043e \u0438 \u0441 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438. \u0412 \u0441\u0438\u043b\u0443 \u0441\u0432\u043e\u0435\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u044b \u0442\u0430\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0441\u043e\u0431\u043b\u0435\u043d\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 SQL \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440. \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043d\u0430 Rust. \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0441\u0442\u043e\u043b\u044c \u0432\u0435\u043b\u0438\u043a\u0438, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0432 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c select \u0441 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 100 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u0437\u0430 20 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<h2>\u041e\u0431\u0449\u0438\u0439 \u043f\u043b\u0430\u043d.<\/h2>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0446\u0435\u043b\u044c &#8212; \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"sql\">select * from (select sym,size,count(*),avg(price) into r   from bt where price&gt;10.0 and sym='fb'   group by sym,size)   as t1 join ref on t1.sym=ref.sym, t1.size = ref.size<\/code><\/pre>\n<p>\u0422.\u0435. \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u044c where \u0438 group by \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 &#8212; inner join \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u044f \u0432\u043e\u0437\u044c\u043c\u0443 <a href=\"https:\/\/www.kx.com\">Q<\/a>, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f &#8212; \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 \u043b\u0435\u043a\u0441\u0435\u0440\u0430, \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430. \u0414\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043c\u0435\u0441\u0442\u0430 \u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u0435\u0441\u0442\u0430, \u0430 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/quintanar401\/sql-demo\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0422\u0430\u043a \u0436\u0435 \u0434\u043b\u044f  \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e \u043b\u0438\u0448\u044c \u0447\u0430\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0431\u044b\u043b\u043e \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: join, where, group by, 3 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0442.\u043f.<\/p>\n<p>\u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445 \u043f\u0440\u0438\u0435\u043c\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445, &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u041f\u0430\u0440\u0441\u0435\u0440\u044b \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u0442 \u043d\u0435 \u0434\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0443\u043f\u043e\u0440 \u043d\u0430 Rust \u0438 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u043d\u0430 \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e-\u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0432\u043e\u044e \u0432\u0442\u043e\u0440\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u0441\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0435\u0440\u0435\u043d\u0435\u0441 \u0435\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u0442\u043e\u043c\u043b\u044f\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440. \u041d\u0430 Q \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b &#8212; \u0441\u0442\u0440\u043e\u043a 25. \u041d\u0430 Rust, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f. \u041d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e \u0448\u0430\u0433\u0430\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 Q, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u044f \u0438\u0445 \u043a \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 Rust.<\/p>\n<p>\u042d\u0442\u043e \u043c\u043e\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 Rust \u0438 \u0441\u0440\u0430\u0437\u0443 \u0445\u043e\u0447\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u043b\u0443\u0445\u0438 \u043e \u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u044b. \u0415\u0441\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435 (read only), \u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a Rust \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0437\u0430\u0431\u0440\u0430\u043a\u043e\u0432\u0430\u043b \u043c\u043e\u0438 \u0438\u0434\u0435\u0438, \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0435\u0433\u043e \u043e\u043d \u0445\u043e\u0447\u0435\u0442 \u0438 \u0443\u0436\u0435 \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c \u0438\u0437-\u0437\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0441\u0441\u044b\u043b\u043e\u043a, \u0430 \u044f\u0432\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0436\u0438\u0437\u043d\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u043f\u043e \u0434\u0435\u043b\u0443. \u0417\u0430\u0442\u043e \u0432\u0437\u0430\u043c\u0435\u043d \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u043f\u043e \u0449\u0435\u043b\u0447\u043a\u0443 \u043f\u0430\u043b\u044c\u0446\u0435\u0432. \u0427\u0442\u043e \u043c\u044b \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0435\u043d\u043e\u043c\u0435\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u0442\u043e\u043b\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>\u0412 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0412\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0443\u0442, \u0447\u0442\u043e \u0431\u0435\u0437 \u0440\u0430\u0437\u043d\u0438\u0446\u044b &#8212; \u043f\u0438\u0448\u0438\u0442\u0435 \u0432\u044b \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0438\u043b\u0438 \u043d\u0430 Rust, \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0435\u043b\u0430\u044e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043d\u0430 Q \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e \u0432 \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0440\u0430\u0437\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0441\u0430\u043c\u043e\u0433\u043e Q \u043d\u0430 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<h2>\u041b\u0435\u043a\u0441\u0435\u0440<\/h2>\n<p>\u0412\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432. \u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f fsa, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0438 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">fsa[state;char] -&gt; state<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e \u0432\u0441\u0435\u0439 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043b\u0435\u043a\u0441\u0435\u0440\u0430, \u0442.\u0435. \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u0430. \u0412\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043e\u0441\u043e\u0431\u044b\u0445 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u0442\u044c \u043f\u043e \u043d\u0438\u043c \u0432\u0445\u043e\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438. \u0421\u0445\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0422.\u0435. \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u0430\u043f\u044b: <\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u0433\u0440\u0443\u043f\u043f\u044b (my.var -&gt; aa.aaa, 12.01 -&gt; 00.00, &#171;str 1&#187; -&gt; &#171;sss 1&#187; \u0438 \u0442.\u0434.).<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f. \u0417\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 fsa (aa.aaa -&gt; aAAAAA, 00.00 -&gt; 0IFFF, &#171;sss 1&#187; -&gt; &#171;SSSSSR).<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c (a, 0, &#187; \u0438 \u0442.\u0434.). \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432\u0441\u0435 \u043d\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0431\u0443\u043a\u0432\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0441\u0435 \u0442\u0440\u0438 \u044d\u0442\u0430\u043f\u0430 &#8212; \u044d\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 Q \u044d\u0442\u0430 \u0438\u0434\u0435\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 (\u0432\u0441\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0442\u0430\u043a, \u0447\u0442\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 limit):<\/p>\n<pre><code class=\"cpp\">(where fsa\\[start;input]&lt;limit)cut input<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0441\u044c \u043b\u0435\u043a\u0441\u0435\u0440. \u041f\u0440\u0430\u0432\u0434\u0430 \u0435\u0449\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c fsa. \u0412 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 fsa \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 &#8212; \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0438 \u0440\u0443\u043a\u0430\u043c\u0438, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 DSL. \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 (\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f ASCII \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b):<\/p>\n<pre><code class=\"cpp\">cgrp: (\"\\t \\r\\n\";\"0..9\";\"a..zA..Z\"),\"\\\\\\\"=&lt;&gt;.'\"; c2grp: 128#0; \/\/ \u043c\u0430\u0441\u0441\u0438\u0432 [0;128] \/\/ Q \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043b\u044e\u0431\u043e\u0439 \u0444\u043e\u0440\u043c\u044b. \/\/ \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432. \u0412 Rust \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u0432\u0430 \u044f\u0432\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430: \/\/ cgrp.iter().enumerate().for_each(|(i,&amp;s)| s.iter() \/\/   .for_each(|&amp;s| c2grp[s as usize] = i + 1)); c2grp[`int$cgrp]: 1+til count cgrp;<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u044f \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u0432\u0441\u0435 \u0446\u0438\u0444\u0440\u044b \u0438 \u0431\u0443\u043a\u0432\u044b. \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0446\u0438\u0444\u0440\u044b, \u0431\u0443\u043a\u0432\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u041c\u044b \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0438 \u0433\u0440\u0443\u043f\u043f\u044b \u0447\u0438\u0441\u043b\u0430\u043c\u0438 1, 2 \u0438 \u0442.\u0434., \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 0. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 c2grp:<\/p>\n<pre><code class=\"cpp\">c2grp `int$string<\/code><\/pre>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435(\u044f);\u0433\u0440\u0443\u043f\u043f\u0430(\u044b) \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432) -&gt; \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0414\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0433\u0440\u0443\u043f\u043f \u0438 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0433\u0440\u0443\u043f\u043f (\u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u044b 0..9 &#8212; 0, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440). \u0414\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 &#8212; \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u0443\u043a\u0432\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f \u0438\u043c\u0435\u043d \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>aA \u0410 a0.<\/code><\/pre>\n<p>\u0442.\u0435. \u0435\u0441\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445 &#171;a&#187; (\u043d\u0430\u0447\u0430\u043b\u043e \u0438\u043c\u0435\u043d\u0438) \u0438\u043b\u0438 &#171;A&#187; (\u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u043c\u0435\u043d\u0438), \u0438 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0437 \u0433\u0440\u0443\u043f\u043f [a,0,.], \u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 &#171;A&#187;. \u0412 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 &#171;a&#187; \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u0431\u0443\u043a\u0432\u0443 (\u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e). \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u043d \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u0431\u0443\u043a\u0432\u0443, \u0446\u0438\u0444\u0440\u0443 \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0443, \u0442\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 &#171;A&#187; \u0438 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043c \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b. \u042f \u0437\u0430\u043f\u0438\u0448\u0443 \u0432\u0441\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 (Rust):<\/p>\n<pre><code class=\"rust\">let rules: [&amp;[u8];21] =   [b\"aA A a0.\",                         \/\/ \u0438\u043c\u0435\u043d\u0430    b\"0I I 0\",b\"0I F .\",b\"F F 0\",        \/\/ int\/float    b\"= E =\",b\"&gt; E =\",b\"&lt; E =\",b\"&lt; E &gt;\", \/\/ &lt;&gt;, &gt;= \u0438 \u0442.\u043f.    b\"\\\" S *\",b\"S S *\",b\"\\\"S R \\\"\",      \/\/ \"str\"    b\"' U *\",b\"U U *\",b\"'U V '\",         \/\/ 'str'    b\"\\tW W \\t\"];                        \/\/ \u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b<\/code><\/pre>\n<p>\u0427\u0438\u0441\u043b\u0430 \u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u0434\u0430\u043d\u044b \u0432 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435. &#171;*&#187; \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 &#8212; \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b. \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u0443\u043a\u0432\u044b &#8212; \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u0422\u0430\u043a\u0430\u044f \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043b\u0435\u0433\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0442\u043e\u043a\u0435\u043d\u0430 &#8212; \u044d\u0442\u043e \u0432\u0441\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u0443\u043a\u0432\u044b.<\/p>\n<p>\u041c\u0430\u0442\u0440\u0438\u0446\u0430 fsa \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e. \u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>fsa[*;y] = y (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439) \"aA A a0.\" -&gt; \"aA\",\"A\",\"a0.\"; fsa[enc[\"aA\"];enc[\"a0.\"]] = enc[\"A\"] ...<\/code><\/pre>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 states:<\/p>\n<pre><code class=\"cpp\">states: distinct \" \",(first each cgrp),raze fsa[;1]; limit: 2+count cgrp; enc:states?; \/\/ \u0432 Q encode - \u044d\u0442\u043e \u043f\u043e\u0438\u0441\u043a \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u0435<\/code><\/pre>\n<p>\u0412\u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432\u0441\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (\u043f\u0440\u043e\u0431\u0435\u043b \u0434\u043b\u044f \u0443\u0447\u0435\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u044b 0), \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c limit.<\/p>\n<p>\u041a\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 fsa \u044f \u043e\u043f\u0443\u0441\u043a\u0430\u044e &#8212; \u043e\u043d \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u0445\u0435\u043c\u0435 \u0432\u044b\u0448\u0435.<\/p>\n<p>\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0430\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e lex. \u0412 \u043f\u0430\u0440\u0441\u0435\u0440\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0442\u044c \u0442\u0438\u043f \u0442\u043e\u043a\u0435\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u0438 \u0435\u0433\u043e \u0442\u043e\u0436\u0435. \u041d\u0430 Rust \u043b\u0435\u043a\u0441\u0435\u0440 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">let s2n = move |v| [\"ID\",\"NUM\",\"STR\",\"STR\",\"WS\",\"OTHER\"][find1(&amp;stn,&amp;v)]; move |s| {     if s.len()==0 {return Vec::&lt;Token&gt;::new()};     let mut sti = 0usize;     let st: Vec&lt;usize&gt; = s.as_bytes().iter().map(|b| { \/\/ st:fsa\\[0;c2grp x]         sti = fsa[sti][c2grp[std::cmp::min(*b as usize,127)]];         sti}).collect();     let mut ix: Vec&lt;usize&gt; = st.iter().enumerate() \/\/ ix:where st&lt;sta         .filter_map(|(i,v)| if *v&lt;sta {Some(i)} else {None}).collect();     ix.push(st.len());     (0..ix.len()-1).into_iter()         .filter_map(|i|             match s2n(st[ix[i]]) {                  \"WS\" =&gt; None,                   kind =&gt; Some(Token{ str:&amp;s[ix[i]..ix[i+1]], kind})              }).collect()<\/code><\/pre>\n<p>\u041d\u0430 Q \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0430\u0442\u043a\u043e:<\/p>\n<pre><code class=\"cpp\">s2n:(states?\"a0\\\"'\\t\")!(\"ID\";\"NUM\";\"STR\";\"STR\";\"WS\"); lex:{   i:where (st:fsa\\[0;c2grp x])&lt;limit;   {x[;where not \"WS\"~\/: x 0]} (s2n st i;i cut x)};<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0435\u043a\u0441\u0435\u0440, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<pre><code class=\"cpp\">lex \"10 + a0\" -&gt; ((\"NUM\";\"\";\"ID\");(\"10\";\"+\";\"a0\"))<\/code><\/pre>\n<h2>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440<\/h2>\n<p>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438 &#8212; \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 select. \u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430 \u043d\u0430 Q, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u043e\u0434\u0430 \u043d\u0430 Rust. \u042f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a \u0432 \u0446\u0435\u043b\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440. \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0438\u0442 enum Val:<\/p>\n<pre><code class=\"rust\">type RVal=Arc&lt;Val&gt;;\t enum Val {        I(i64),     D(f64),     II(Vec&lt;i64&gt;),     DD(Vec&lt;f64&gt;),     S(Arc&lt;String&gt;),     SS(Vec&lt;Arc&lt;String&gt;&gt;),     TBL(Dict&lt;RVal&gt;),     ERR(String), }<\/code><\/pre>\n<p>\u0415\u0441\u0442\u044c \u0442\u0440\u0438 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 &#8212; \u0441\u0442\u0440\u043e\u043a\u0438, \u0446\u0435\u043b\u044b\u0435 \u0438 \u043d\u0435\u0446\u0435\u043b\u044b\u0435, \u0434\u0432\u0435 \u0444\u043e\u0440\u043c\u044b \u0438\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f &#8212; \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0430\u044f \u0438 \u0432\u0435\u043a\u0442\u043e\u0440. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u043e\u0448\u0438\u0431\u043a\u0438. Dict &#8212; \u044d\u0442\u043e \u043f\u0430\u0440\u0430 Vec&lt;String&gt; \u0438 Vec&lt;T&gt; \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b T = Vec&lt;RVal&gt;, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 Val &#8212; \u044d\u0442\u043e II, DD \u0438\u043b\u0438 SS. Rust \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432 \u043b\u0435\u0433\u043a\u0443\u044e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u0435\u043b\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043d\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438.  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u043e\u0431\u0435\u0440\u043d\u0443\u043b \u0432\u0441\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a Arc. \u0421\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u044d\u0442\u043e \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438:<\/p>\n<pre><code class=\"rust\">enum Expr {     Empty,     F1(fn (RVal) -&gt; RRVal, Box&lt;Expr&gt;), \/\/ f(x)     F2(fn (RVal,RVal) -&gt; RRVal, Box&lt;Expr&gt;, Box&lt;Expr&gt;), \/\/ f(x,y)     ELst(Vec&lt;Expr&gt;),     ID(String),  \/\/ variable\/column     Val(Val),    \/\/ simple value - 10, \"str\"     Set(String,Box&lt;Expr&gt;), \/\/ 'set var expr' -<\/code><\/pre>\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-324712","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/324712","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=324712"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/324712\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=324712"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=324712"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=324712"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}