{"id":218341,"date":"2014-04-09T00:12:02","date_gmt":"2014-04-08T20:12:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=218341"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=218341","title":{"rendered":"<span class=\"post_title\">\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0438\u043b\u0438 \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043b\u044f\u043c\u0431\u0434 \u0432 C++11<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/7d6\/4b7\/f83\/7d64b7f83b4d78f198856db9039c3978.jpg\" alt=\"Yo dawg, I heard you like programming. So we put a language in you language, so you can program while you program\" align=\"right\"\/>\u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0441\u043a\u043e\u0447\u0438\u043b\u0430 <a href=\"http:\/\/habrahabr.ru\/post\/218229\/\">\u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043f\u0440\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 C++ \u043e\u0442 <a href=\"http:\/\/habrahabr.ru\/users\/hurrthedurr\/\" class=\"user_link\">HurrTheDurr<\/a>. \u0412 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043a \u043d\u0435\u0439 \u043b\u0438\u0447\u043d\u043e \u044f \u0443\u0432\u0438\u0434\u0435\u043b \u0432\u044b\u0437\u043e\u0432:<\/p>\n<p>  <font color=\"DimGray\">&gt; \u0421 \u043a\u0430\u0436\u0434\u044b\u043c \u043d\u043e\u0432\u044b\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0432\u0438\u0445\u043d\u0443\u0442\u044c \u0441\u0435\u0431\u0435 \u043c\u043e\u0437\u0433 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0421++ \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f)<br \/>  &gt; &gt; \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435 \u043d\u0430\u0434 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438, \u0430 \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438.<\/font><\/p>\n<p>  \u0410 \u0442\u0430\u043a \u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u0438\u043f\u0430\u0445, \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0447\u0435\u043c \u043a\u043b\u0435\u0442\u043e\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442? \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e; \u044f \u0432 30 \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043d\u0430 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e, \u0447\u0435\u043c \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u043e\u0434\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044f.<\/p>\n<p>  \u0427\u0443\u0442\u044c \u0440\u0430\u043d\u044c\u0448\u0435 <a href=\"http:\/\/habrahabr.ru\/users\/avenat\/\" class=\"user_link\">AveNat<\/a> \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0430 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <a href=\"http:\/\/habrahabr.ru\/post\/215807\/\">\u0432 \u0434\u0432\u0443\u0445<\/a> <a href=\"http:\/\/habrahabr.ru\/post\/215991\">\u0447\u0430\u0441\u0442\u044f\u0445<\/a>, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e (\u043e\u0431\u0440\u0430\u0437\u043d\u043e) \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">#include &lt;iostream&gt;  #include &lt;LC\/kernel.h&gt; #include &lt;LC\/church_numerals.h&gt;  int main() {     \/\/ \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0432 \u0432\u0438\u0434\u0435 \u043b\u044f\u043c\u0431\u0434\u0430-\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439     typedef ChurchEncode&lt;2&gt; Two;    \/\/ 2 = \u03bbfx.f (f x)     typedef ChurchEncode&lt;3&gt; Three;  \/\/ 3 = \u03bbfx.f (f (f x))      \/\/ * = \u03bbab.\u03bbf.a (b f)     typedef Lambda&lt;'a', Lambda&lt;'b', Lambda&lt;'f',                 Apply&lt;Var&lt;'a'&gt;, Apply&lt;Var&lt;'b'&gt;, Var&lt;'f'&gt; &gt; &gt;         &gt; &gt; &gt; Multiply;      \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 (* 2 3)     typedef Eval&lt;Apply&lt;Apply&lt;Multiply, Two&gt;, Three&gt;&gt; Output;      \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043e\u0442 \u043b\u044f\u043c\u0431\u0434\u0430-\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u043a \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u0430\u043c     typedef ChurchDecode&lt;Output&gt; Result;      std::cout &lt;&lt; Result::value; } <\/code><\/pre>\n<p>  \u0410 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code>ilammy@ferocity ~ $ gcc cpp.cpp ilammy@ferocity ~ $ .\/a.out 6 <\/code><\/pre>\n<p>  \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u043e\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0448\u0442\u0443\u043a\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f. \u0418 \u0435\u0449\u0451 \u043e\u043d\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0437\u043d\u0430\u043d\u0438\u0439 \u043e \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438. \u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u043e\u0431\u0437\u043e\u0440\u043e\u0432, \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u0437\u043d\u0430\u043d\u0438\u044f C++ (\u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438), \u0438 \u0437\u0434\u0440\u0430\u0432\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e.<\/p>\n<p>  \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0422\u044c\u044e\u0440\u0438\u043d\u0433-\u043f\u043e\u043b\u043d\u043e\u0442\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 C++ \u0432 \u0432\u0438\u0434\u0435 compile-time \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0431\u0435\u0441\u0442\u0438\u043f\u043e\u0432\u043e\u0433\u043e \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f (\u043f\u043b\u044e\u0441 \u043f\u0435\u0447\u0435\u043d\u044c\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438).<a name=\"habracut\"><\/a><\/p>\n<p>  (\u0422\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b C++03 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 <code>&lt;<\/code>\u0430\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0445<code>&lt;<\/code>\u0443\u0433\u043b\u043e\u0432\u044b\u0445<code>&lt;<\/code>\u0441\u043a\u043e\u0431\u043e\u043a<code>&lt;<\/code>\u0432<code>&lt;<\/code>\u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445<code>&gt; &gt; &gt; &gt; &gt;<\/code>, \u0430 \u043c\u0435\u043d\u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043a\u043e\u0440\u043e\u0431\u0438\u0442 \u043e\u0442 \u0438\u0445 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430, \u0442\u043e \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 C++11, \u0438\u043b\u0438 <abbr title=\"\u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0430\u0440\u0443 &gt;&gt; \u043d\u0430 &gt; &gt;, \u043f\u043e\u043a\u0430 \u0442\u0430\u043a\u0438\u0445 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f\"><code>sed ':l;s\/&gt;&gt;\/&gt; &gt;\/g;tl'<\/code><\/abbr>. \u0417\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u0432 \u043a\u043e\u0434\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 C++11.)<\/p>\n<p>  <\/p>\n<h3>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/h3>\n<p>  \u041f\u043e\u0435\u0445\u0430\u043b\u0438. \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0442\u0435\u0440\u043c\u044b \u0432 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u0442\u0440\u0451\u0445 \u0432\u0438\u0434\u043e\u0432:<\/p>\n<table>\n<tr>\n<td><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/2e8\/950\/db3\/2e8950db36a441aa8eb02ee2cab7d60d.gif\" alt=\"v\"\/><\/td>\n<td>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e<\/td>\n<td><i>v<\/i> \u2014 \u0438\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/td>\n<\/tr>\n<tr>\n<td><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/c83\/435\/632\/c834356328534658a7df7ec0b73695bb.gif\" alt=\"\u03bbv.B\"\/><\/td>\n<td>\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f<\/td>\n<td><i>v<\/i> \u2014 \u0438\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, <i>B<\/i> \u2014 \u0442\u0435\u0440\u043c<\/td>\n<\/tr>\n<tr>\n<td><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/7de\/bb7\/79b\/7debb779b9d249cfb6f0f4653684262f.gif\" alt=\"(f x)\"\/><\/td>\n<td>\u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f<\/td>\n<td><i>f<\/i> \u0438 <i>x<\/i> \u2014 \u0442\u0435\u0440\u043c\u044b<\/td>\n<\/tr>\n<\/table>\n<p>\u0412\u0441\u0435 \u044d\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 C++. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u044f\u0437\u044b\u043a\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0438\u043f\u044b. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0435\u0441\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0432\u043e\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445. \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u044f \u0438\u0445, \u043c\u044b \u0432\u0432\u043e\u0434\u0438\u043c \u0430\u043a\u0441\u0438\u043e\u043c\u0443 \u00ab\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u00bb:<\/p>\n<pre><code class=\"cpp\">template &lt;class Var&gt;            struct Ref; \/\/ \u0441\u0441\u044b\u043b\u043a\u0438 template &lt;class Var, class Exp&gt; struct Lam; \/\/ \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 template &lt;class Fun, class Arg&gt; struct App; \/\/ \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 <\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <i>v<\/i> \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435, \u0431\u0435\u0437 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0435\u0451 \u0441 \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u0440\u043c\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e <i>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e<\/i>, \u0430 \u043d\u0435 \u0441\u0430\u043c\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f. \u0422\u0430\u043a \u0447\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c, \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c:<\/p>\n<pre><code class=\"cpp\">template &lt;char  Var&gt;            struct Ref; template &lt;char  Var, class Exp&gt; struct Lam; template &lt;class Fun, class Arg&gt; struct App; <\/code><\/pre>\n<p>  \u041c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0442\u0438\u043f\u0430 <code>char<\/code> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0435\u0449\u0451 \u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e: \u043d\u0435 \u043d\u0430\u0434\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u0417\u0430\u043e\u0434\u043d\u043e \u044d\u0442\u043e \u044f\u0432\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0438\u043f\u0430\u043c\u0438 C++).<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Fun Fact<\/b><\/p>\n<div class=\"spoiler_text\">\u0418\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432: <code>'foo'<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e \u0430\u043f\u043e\u043b\u043e\u0433\u0435\u0442\u044b \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u044d\u0442\u043e \u0440\u043e\u0441\u043a\u043e\u0448\u044c\u044e. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u043e\u0432 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 (<abbr title=\"[lex.ccon]\">2.14.3\/1<\/abbr>), \u0447\u0442\u043e \u0432 \u0440\u0435\u0434\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0438\u043c\u0451\u043d.<\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u043b\u044e\u0431\u044b\u0435 \u043b\u044f\u043c\u0431\u0434\u0430-\u0442\u0435\u0440\u043c\u044b!<\/p>\n<pre><code class=\"cpp\">typedef Lam&lt;'f', App&lt;Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, App&lt;Ref&lt;'x'&gt;, Ref&lt;'x'&gt;&gt;&gt;&gt;,                      Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, App&lt;Ref&lt;'x'&gt;, Ref&lt;'x'&gt;&gt;&gt;&gt;&gt;&gt; Y; <\/code><\/pre>\n<h3>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?<\/h3>\n<p><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/133\/e49\/0e2\/133e490e269048ab9255293592d17f1b.png\" alt=\"f(x)\" align=\"right\"\/><br \/>  \u0423\u043c\u0435\u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0435\u0440\u043c\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c. \u0412\u043e\u0442 \u0442\u0443\u0442 \u0443\u0436\u0435 \u0432\u0441\u0451 \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0430\u0434\u043e\u0432\u043e\u0439 \u043c\u0430\u0433\u0438\u0438 \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0441\u0451 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f. \u041b\u0438\u0447\u043d\u043e \u043c\u043d\u0435 \u0431\u043b\u0438\u0436\u0435 Scheme, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e. \u0421 \u0440\u0430\u0432\u043d\u044b\u043c \u0443\u0441\u043f\u0435\u0445\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0432\u0440\u043e\u0434\u0435 Haskell. (\u0410 \u0435\u0449\u0451 \u043b\u0443\u0447\u0448\u0435 \u2014 \u041f\u0440\u043e\u043b\u043e\u0433.)<\/p>\n<p>  \u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0430\u043c\u0438\u0445 \u0442\u0435\u0440\u043c\u043e\u0432, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438:<\/p>\n<pre><code class=\"lisp\">; Y = \u03bbf.(\u03bbx.f (x x)) (\u03bbx.f (x x)) (define Y '(lambda (f) ((lambda (x) (f (x x)))                         (lambda (x) (f (x x))) ))) <\/code><\/pre>\n<p>  \u0417\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"lisp\">; \u0422\u0435\u0440\u043c \u2014 \u044d\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430, \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f, \u0438\u043b\u0438 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f. (define (term? exp)   (or (ref? exp) (lam? exp) (app? exp)) )  ; \u0421\u0441\u044b\u043b\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438. (define (ref? exp) (symbol? exp))  ; \u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u0442\u0440\u0451\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. (define (lam? exp)   (and (list-of? 3 exp) ; \u0413\u0434\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u2014 \u044d\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b lambda.        (eqv? 'lambda (first exp)) ; \u0412\u0442\u043e\u0440\u043e\u0439 \u2014 \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430.        (list-of? 1 (second exp))        (symbol? (first (second exp))) ; \u0410 \u0442\u0440\u0435\u0442\u0438\u0439 \u2014 \u044d\u0442\u043e \u0442\u0435\u0440\u043c.        (term? (third exp)) ) )  ; \u0410\u043f\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u0434\u0432\u0443\u0445 \u0442\u0435\u0440\u043c\u043e\u0432. (define (app? exp)   (and (list-of? 2 exp)        (term? (first exp))        (term? (second exp)) ) ) <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>eval<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u0440\u043c\u044b, \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044f \u0438\u0445 \u043f\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0443:<\/p>\n<pre><code class=\"lisp\">(define (eval exp)   (cond ((ref? exp) (eval-ref exp))         ((lam? exp) (eval-lam (first (second exp)) (third exp)))         ((app? exp) (eval-app (first exp) (second exp)))         (else (error &quot;eval: syntax error&quot; exp)) ) ) <\/code><\/pre>\n<p>  \u041e\u0442\u043b\u0438\u0447\u043d\u043e. \u041d\u043e \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <code>eval-ref<\/code>? \u041e\u0442\u043a\u0443\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0443\u0437\u043d\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439? \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043a\u0430\u043a <i>\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435<\/i> (environment). \u0412 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0438 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 <code>eval<\/code> \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a \u2014 \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c:<\/p>\n<pre><code class=\"lisp\">(define (eval exp env)   (cond ((ref? exp) (eval-ref exp env))         ((lam? exp) (eval-lam (first (second exp)) (third exp) env))         ((app? exp) (eval-app (first exp) (second exp) env))         (else (error &quot;Syntax error&quot; exp)) ) ) <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u044d\u0442\u043e \u043f\u043e\u0438\u0441\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438:<\/p>\n<pre><code class=\"lisp\">(define (eval-ref var env)   (lookup var env) ) <\/code><\/pre>\n<p>  \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u042d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0434\u0451\u0442 \u0432\u0440\u0435\u043c\u044f. \u0421\u043c\u044b\u0441\u043b \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0451 \u0442\u0435\u043b\u043e <code>exp<\/code> \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u0433\u0434\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 <code>var<\/code> \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 <code>arg<\/code>. \u041e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>bind<\/code>.<\/p>\n<pre><code class=\"lisp\">(define (eval-lam var exp env)   (lambda (arg)     (eval exp (bind var arg env)) ) ) <\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0433\u0443\u0442 \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0442\u0430\u043a\u0438\u043c\u0438 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 \u043c\u0435\u0441\u0442\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0438\u0437 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <code>env<\/code>). \u0418\u0437-\u0437\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <i>\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f\u043c\u0438<\/i>.<\/p>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u2014 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 <code>fun<\/code> \u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 <code>arg<\/code>.<\/p>\n<pre><code class=\"lisp\">(define (eval-app fun arg env)   ((eval fun env) (eval arg env)) ) <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u0438 \u0435\u0451 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, <code>eval<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u044e \u043b\u044f\u043c\u0431\u0434\u0430-\u0442\u0435\u0440\u043c\u043e\u0432 \u0432 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 (\u0441 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e).<\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u043c\u0438. <code>lookup<\/code> \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0438 <code>bind<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"lisp\">(define (bind var val env)       ; \u0414\u043b\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438:   (cons (cons var val) env) )    ;   (bind 'x 1 '((y . 2)))  ===&gt;  ((x . 1) (y . 1))                                  ;   (lookup 'x '((x . 1) (y . 2)))  ===&gt;  1 (define (lookup var env)         ;   (lookup 'y '((x . 1) (y . 2)))  ===&gt;  2   (let ((cell (assq var env)))   ;   (lookup 'z '((x . 1) (y . 2)))  ===&gt;  #&lt;ERROR&gt;     (if cell (cdr cell)         (error &quot;lookup: unbound variable&quot; var) ) ) ) <\/code><\/pre>\n<p>  \u0421\u0443\u043f\u0435\u0440! \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 \u0447\u0438\u0441\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435. (<a href=\"https:\/\/gist.github.com\/ilammy\/0f12bbe9b15903dcdb06\">\u0412\u0435\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a<\/a>.) \u0418 \u043e\u043d \u0434\u0430\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<pre><code class=\"lisp\">(eval '((lambda (x) x) B)        (bind 'B 42 '()) ) ; ===&gt; 42 <\/code><\/pre>\n<h3>\u041d\u043e \u0447\u0442\u043e \u0437\u0430 \u0441\u043a\u043e\u0431\u043a\u0438? \u0418 \u043f\u0440\u0438 \u0447\u0451\u043c \u0437\u0434\u0435\u0441\u044c C++?<\/h3>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/3a3\/759\/7a9\/3a37597a9006475cbdb3e5d94712401c.png\" alt=\"I&#39;m two pages in an still have no idea what are you saying\" align=\"left\"\/>\u0413\u043b\u044f\u0434\u044f \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u043d\u0430 Scheme, \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043b\u044f\u043c\u0431\u0434\u0430-\u0442\u0435\u0440\u043c\u043e\u0432 \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 C++. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0441\u0430\u043c\u0438 \u0442\u0435\u0440\u043c\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cpp\">template &lt;char  Var&gt;            struct Ref; template &lt;char  Var, class Exp&gt; struct Lam; template &lt;class Fun, class Arg&gt; struct App; <\/code><\/pre>\n<p>  <\/p>\n<h4>\u0428\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043d\u0435 \u0442\u0435)<\/h4>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f-\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>Eval<\/code>. \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 \u043d\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043e\u0434\u043d\u0438\u043c\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cpp\">template &lt;class Exp, class Env&gt; struct Eval; <\/code><\/pre>\n<p>  \u0412\u044b\u0437\u043e\u0432\u043e\u043c \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430: <code>Eval&lt;Exp, Env&gt;<\/code>. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0442\u0438\u043f\u043e\u043c C++. \u0423\u0441\u043b\u043e\u0432\u0438\u043c\u0441\u044f, \u0447\u0442\u043e <code>Eval<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u0442\u0438\u043f <code>value<\/code>, \u0435\u0441\u043b\u0438 \u0435\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">typename Eval&lt;Exp, Env&gt;::value <\/code><\/pre>\n<p>\u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <code>Eval<\/code> \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 <code>Exp<\/code> \u0438 <code>Env<\/code> (\u0432 \u0432\u0438\u0434\u0435 \u0442\u0438\u043f\u0430 <code>value<\/code>). \u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u0447\u0435\u043d (\u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430), \u0442\u043e \u0442\u0438\u043f <code>value<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u00ab\u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00bb.<\/p>\n<h4>Eval \u0438 Apply<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <code>Eval<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u2014 \u044d\u0442\u043e \u043f\u043e\u0438\u0441\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>Lookup<\/code> (\u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 <code>result<\/code>):<\/p>\n<pre><code class=\"cpp\">template &lt;char Var, class Env&gt; struct Eval&lt;Ref&lt;Var&gt;, Env&gt; {     typedef typename Lookup&lt;Var, Env&gt;::result value; }; <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u2014 \u044d\u0442\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c <code>Closure<\/code>. \u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432 \u0441\u0435\u0431\u0435 (\u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e) \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">template &lt;char Var, class Exp, class Env&gt; struct Eval&lt;Lam&lt;Var, Exp&gt;, Env&gt; {     typedef Closure&lt;Lam&lt;Var, Exp&gt;, Env&gt; value; }; <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u2014 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0443 (\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>Apply<\/code>):<\/p>\n<pre><code class=\"cpp\">template &lt;class Fun, class Arg, class Env&gt; struct Eval&lt;App&lt;Fun, Arg&gt;, Env&gt; {     typedef typename Apply&lt;typename Eval&lt;Fun, Env&gt;::value,                            typename Eval&lt;Arg, Env&gt;::value&gt;::result value; }; <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, <code>Eval<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f <code>Ref<\/code>, <code>Lam<\/code>, <code>App<\/code> (\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0432\u0442\u043e\u0440\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c). \u0412\u044b\u0437\u043e\u0432\u044b <code>Eval<\/code> \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f.<\/p>\n<p>  \u0418\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0435 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0435\u0451 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f). \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">template &lt;class Abs, class Env&gt; struct Closure; <\/code><\/pre>\n<p>  \u0412\u0441\u044f \u0441\u0443\u0442\u044c \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>Apply<\/code>. \u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 <code>Bind<\/code> \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a \u0435\u0433\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e:<\/p>\n<pre><code class=\"cpp\">template &lt;class Fun, class Arg&gt; struct Apply;  template &lt;char Var, class Exp, class Env, class Arg&gt; struct Apply&lt;Closure&lt;Lam&lt;Var, Exp&gt;, Env&gt;, Arg&gt; {     typedef typename Eval&lt;Exp, Bind&lt;Var, Arg, Env&gt;&gt;::value result; }; <\/code><\/pre>\n<p>(\u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e <code>Apply<\/code> \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439.)<\/p>\n<h4>Lookup \u0438 Bind<\/h4>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u043c\u0435\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">struct NullEnv; <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Bind<\/code>. \u042d\u0442\u043e\u0442 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>Var<\/code> \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>Val<\/code>, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c <code>Env<\/code>:<\/p>\n<pre><code class=\"cpp\">template &lt;char Var, class Val, class Env&gt; struct Bind; <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445.<\/p>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043c\u0435\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u2014 \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u041f\u043e\u0438\u0441\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>Lookup<\/code>:<\/p>\n<pre><code class=\"cpp\">template &lt;char Var, class Env&gt; struct Lookup; <\/code><\/pre>\n<p>  \u0412 \u043f\u0443\u0441\u0442\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u0438\u0441\u043a\u043e\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0435\u0441\u0442\u044c \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0433\u043e. \u0418\u043d\u0430\u0447\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">template &lt;char Var&gt; struct Lookup&lt;Var, NullEnv&gt;;  template &lt;char Var, class Val, class Env&gt; struct Lookup&lt;Var, Bind&lt;Var, Val, Env&gt;&gt; {     typedef Val result; };  template &lt;char Var, char OtherVar, class Val, class Env&gt; struct Lookup&lt;Var, Bind&lt;OtherVar, Val, Env&gt;&gt; {     typedef typename Lookup&lt;Var, Env&gt;::result result; }; <\/code><\/pre>\n<p>  <\/p>\n<h4>\u041a\u043e\u043d\u0435\u0446<\/h4>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432 50 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u043c\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 C++, \u0447\u0442\u043e \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0422\u044c\u044e\u0440\u0438\u043d\u0433-\u043f\u043e\u043b\u043d\u043e\u0442\u0443 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 C++ (\u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0451\u043c\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438).<\/p>\n<p>  <a href=\"http:\/\/ubietylab.net\/ubigraph\/content\/Papers\/pdf\/CppTuring.pdf\">\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0422\u044c\u044e\u0440\u0438\u043d\u0433\u0430<\/a> <font color=\"gray\">(<i>\u0430\u043d\u0433\u043b.<\/i>)<\/font> \u043c\u043e\u0436\u043d\u043e \u0432\u0442\u0438\u0441\u043d\u0443\u0442\u044c \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043e\u0431\u044a\u0451\u043c \u0441\u0442\u0440\u043e\u043a, \u043d\u043e \u043e\u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. <a href=\"http:\/\/wwwhome.math.utwente.nl\/~mantheyb\/journals\/BotEATCS_BoehmeManthey_CompilingCPP.pdf\">\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u044e-\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/a> <font color=\"gray\">(<i>\u0430\u043d\u0433\u043b.<\/i>)<\/font> \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043a\u043e\u0440\u043e\u0447\u0435, \u043d\u043e \u043d\u0435\u043d\u0430\u043c\u043d\u043e\u0433\u043e. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0435\u0449\u0451 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0446\u0435\u043f\u0435\u0439 \u041c\u0430\u0440\u043a\u043e\u0432\u0430, \u043d\u043e \u0435\u0451 \u044f \u043d\u0435 \u043d\u0430\u0448\u0451\u043b, \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0441\u043b\u043e\u0436\u043d\u043e, \u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443 \u043b\u0435\u043d\u044c.<\/p>\n<p>  \u041e\u043a\u0435\u0439, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 (<a href=\"https:\/\/gist.github.com\/ilammy\/4860e7743fd4fe9693a8\/c0ca03b3731000e72c73470777b49c75b4a62ce3\">\u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434<\/a>):<\/p>\n<pre><code class=\"cpp\">\/* \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 *\/  #include &lt;iostream&gt;  int main() {     \/\/ 1 = \u03bbfx.f x     typedef Lam&lt;'f', Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, Ref&lt;'x'&gt;&gt;&gt;&gt; One;      \/\/ 2 = \u03bbfx.f (f x)     typedef Lam&lt;'f', Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, App&lt;Ref&lt;'f'&gt;, Ref&lt;'x'&gt;&gt;&gt;&gt;&gt; Two;      \/\/ + = \u03bbab.\u03bbfx.a f (b f x)     typedef Lam&lt;'a', Lam&lt;'b', Lam&lt;'f', Lam&lt;'x',                 App&lt;App&lt;Ref&lt;'a'&gt;, Ref&lt;'f'&gt;&gt;,                     App&lt;App&lt;Ref&lt;'b'&gt;, Ref&lt;'f'&gt;&gt;, Ref&lt;'x'&gt;&gt;&gt;         &gt;&gt;&gt;&gt; Plus;      \/\/ Output := (+ 1 2)     typedef Eval&lt;App&lt;App&lt;Plus, One&gt;, Two&gt;, NullEnv&gt;::value Output;      \/\/ \u042d-\u044d-\u044d... \u0410 \u043a\u0430\u043a \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442?     Output::invalid_field; } <\/code><\/pre>\n<p>  <\/p>\n<pre><code>ilammy@ferocity ~\/dev\/tlc $ g++ -std=c++11 lc.cpp lc.cpp: \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u00abint main()\u00bb: lc.cpp:79:5: \u043e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435\u043f\u043e\u043b\u043d\u044b\u0439 \u0442\u0438\u043f \u00abOutput {aka Closure&lt;Lam&lt;'f', Lam&lt;'x', App&lt;App&lt;Ref&lt;'a'&gt;, Ref&lt;'f'&gt; &gt;, App&lt;App&lt;Ref&lt;'b'&gt;, Ref&lt;'f'&gt; &gt;, Ref&lt;'x'&gt; &gt; &gt; &gt; &gt;, Bind&lt;'b', Closure&lt;Lam&lt;'f', Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, App&lt;Ref&lt;'f'&gt;, Ref&lt;'x'&gt; &gt; &gt; &gt; &gt;, NullEnv&gt;, Bind&lt;'a', Closure&lt;Lam&lt;'f', Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, Ref&lt;'x'&gt; &gt; &gt; &gt;, NullEnv&gt;, NullEnv&gt; &gt; &gt;}\u00bb \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0432\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0435 \u0438\u043c\u0435\u043d\u0438      Output::invalid_field;      ^ <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445, \u043d\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0443\u0434\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>  <\/p>\n<h3>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u0435\u0440\u043c\u043e\u0432<\/h3>\n<p><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/858\/27a\/187\/85827a18778b4f5c9719beed9f85adf3.png\" alt=\"Arecibo message\" align=\"right\"\/><br \/>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u2014 \u044d\u0442\u043e \u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0418\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u044b C++, \u043d\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0421 \u043d\u0438\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432. (\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438.)<\/p>\n<p>  \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u0447\u0438\u0441\u0435\u043b \u0427\u0451\u0440\u0447\u0430, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0445 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0447\u0438\u0441\u043b\u043e\u043c \u0427\u0451\u0440\u0447\u0430 \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0434\u0432\u0443\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0430\u044f N \u0440\u0430\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043a\u043e \u0432\u0442\u043e\u0440\u043e\u043c\u0443. (\u041f\u043e\u0442\u043e\u043c\u0443-\u0442\u043e \u043c\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0432\u044b\u0434\u0430\u0447\u0430 gcc.) \u041d\u043e \u0447\u0442\u043e \u043d\u0430\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439? \u0412\u0435\u0434\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u044b \u0435\u0439 \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u0438\u0448\u044c \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438!<\/p>\n<p>  \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0448 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <i>\u0447\u0438\u0441\u0442\u043e\u0435<\/i> \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u043b\u0438\u0448\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438). \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u044f\u043c\u0431\u0434\u0430-\u0442\u0435\u0440\u043c\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0442\u0440\u0451\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u041b\u044e\u0431\u043e\u0435 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <i>\u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435<\/i> \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u2014 \u0432 \u043d\u0451\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u0440\u043c\u043e\u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 C++.<\/p>\n<p>  \u0412\u0432\u0435\u0434\u0451\u043c \u0434\u043b\u044f \u043d\u0438\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0442\u0435\u0440\u043c:<\/p>\n<pre><code class=\"cpp\">template &lt;class T&gt; struct Inj; <\/code><\/pre>\n<p>\u041e\u043d \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 <i>\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044e<\/i> \u0442\u0438\u043f\u0430 <code>T<\/code> \u0432\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u0440\u043c\u043e\u0432 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u044f\u0437\u044b\u043a\u0430 \u2014 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Eval<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u041d\u0443\u2026 \u0442\u0430\u043a \u043a\u0430\u043a <code>T<\/code> \u2014 \u044d\u0442\u043e <i>\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435<\/i> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0442\u043e <code>Eval<\/code> \u043e \u043d\u0451\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043b\u0438\u0448\u044c \u0442\u043e, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u2014 \u044d\u0442\u043e \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u043e:<\/p>\n<pre><code class=\"cpp\">template &lt;class T, class Env&gt; struct Eval&lt;Inj&lt;T&gt;, Env&gt; {     typedef T value; }; <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0447\u0438\u0441\u043b\u0430 (\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u0430\u043c\u0438):<\/p>\n<pre><code class=\"cpp\">struct Zero {     static const unsigned int interpretation = 0; }; <\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0438 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u0430 \u0427\u0451\u0440\u0447\u0430 \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 <code>int<\/code>. \u0412\u0435\u0434\u044c \u0435\u0441\u043b\u0438 N \u0440\u0430\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430 \u043a \u043d\u0443\u043b\u044e, \u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e N.<\/p>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0432 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0442\u0438\u043f\u044b <code>Succ<\/code> (successor) \u0438 <code>Zero<\/code>. \u041f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">Eval&lt;App&lt;Inj&lt;Succ&gt;, Inj&lt;Zero&gt;&gt;, Env&gt;::value  Apply&lt;Eval&lt;Inj&lt;Succ&gt;, Env&gt;, Eval&lt;Inj&lt;Zero&gt;, Env&gt;&gt;::result  Apply&lt;Succ, Zero&gt;::result <\/code><\/pre>\n<p>\u0411\u0438\u043d\u0433\u043e! \u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f <code>Succ<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>Apply<\/code> \u0434\u043b\u044f \u043d\u0435\u0451! (\u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <i>\u0434\u0435\u043b\u044c\u0442\u0430-\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438<\/i>.)<\/p>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430:<\/p>\n<pre><code class=\"cpp\">struct Succ;  template &lt;class N&gt; struct Apply&lt;Succ, N&gt; {     typedef struct _ {         static const unsigned int interpretation = N::interpretation + 1;     } result; }; <\/code><\/pre>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>Apply<\/code> \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0442\u0438\u043f\u043e\u043c, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u0430\u043a <code>result<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0448\u0435 <code>Zero<\/code>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u043d\u0435\u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>int<\/code> \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f! (<a href=\"https:\/\/gist.github.com\/ilammy\/4860e7743fd4fe9693a8\/38dd91dd77fe3f09e8a3bf484b420a2af07b0852\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434<\/a>.)<\/p>\n<pre><code class=\"cpp\">\/* \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 *\/  #include &lt;iostream&gt;  int main() {     \/\/ 1 = \u03bbfx.f x     typedef Lam&lt;'f', Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, Ref&lt;'x'&gt;&gt;&gt;&gt; One;      \/\/ 2 = \u03bbfx.f (f x)     typedef Lam&lt;'f', Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, App&lt;Ref&lt;'f'&gt;, Ref&lt;'x'&gt;&gt;&gt;&gt;&gt; Two;      \/\/ + = \u03bbab.\u03bbfx.a f (b f x)     typedef Lam&lt;'a', Lam&lt;'b', Lam&lt;'f', Lam&lt;'x',                 App&lt;App&lt;Ref&lt;'a'&gt;, Ref&lt;'f'&gt;&gt;,                     App&lt;App&lt;Ref&lt;'b'&gt;, Ref&lt;'f'&gt;&gt;, Ref&lt;'x'&gt;&gt;&gt;         &gt;&gt;&gt;&gt; Plus;      \/\/ Sum = (+ 1 2)     typedef App&lt;App&lt;Plus, One&gt;, Two&gt; Sum;      \/\/ Result := (Sum +1 =0)     typedef App&lt;App&lt;Sum, Inj&lt;Succ&gt;&gt;, Inj&lt;Zero&gt;&gt; Output;      typedef Eval&lt;Output, NullEnv&gt;::value Result;      std::cout &lt;&lt; Result::interpretation; } <\/code><\/pre>\n<p>  <\/p>\n<pre><code>ilammy@ferocity ~\/dev\/tlc $ g++ -std=c++11 lc.cpp  ilammy@ferocity ~\/dev\/tlc $ .\/a.out 3 <\/code><\/pre>\n<p>  <\/p>\n<h4>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/h4>\n<p>\u042f \u0434\u0443\u043c\u0430\u044e, \u0432\u044b \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u0432 <code>main()<\/code> \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>Eval<\/code> \u0441 \u043f\u0443\u0441\u0442\u044b\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c, \u0430 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u00ab\u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043c\u00bb. \u041d\u043e \u044d\u0442\u043e \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>Eval<\/code> \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0433\u0440\u0430\u0442\u044c \u0440\u043e\u043b\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0430: \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u043e \u0437\u0430\u0434\u0430\u0451\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u2014 \u0442\u0435\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0438 \u0441 \u0447\u0435\u043c \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u043b\u044f\u043c\u0431\u0434\u0430-\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0432\u0437\u044f\u0442\u044c \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0442\u0438\u043f \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435. \u0412 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0445 \u043b\u0435\u0436\u0430\u0442 <i>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/i>, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c (<a href=\"https:\/\/gist.github.com\/ilammy\/4860e7743fd4fe9693a8\/7bd3b13bcbbebcb26fd2bd2fa2c970ced2b68734\">\u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434<\/a>):<\/p>\n<pre><code class=\"cpp\">\/* ... *\/  #include &lt;iostream&gt;  int main() {     \/* \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f One, Two, Plus \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u044b *\/      \/\/ Unchurch = \u03bbn.(n +1 =0), \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0438\u0441\u0435\u043b \u0427\u0451\u0440\u0447\u0430 \u0432 int     typedef Lam&lt;'n', App&lt;App&lt;Ref&lt;'n'&gt;, Ref&lt;'I'&gt;&gt;, Ref&lt;'O'&gt;&gt;&gt; Unchurch;      \/\/ Result := (Unchurch (+ 1 2))     typedef Eval&lt;App&lt;Ref&lt;'U'&gt;,                      App&lt;App&lt;Ref&lt;'+'&gt;, Ref&lt;'1'&gt;&gt;, Ref&lt;'2'&gt;&gt;&gt;,                  Bind&lt;'+', typename Eval&lt;Plus, NullEnv&gt;::value,                 Bind&lt;'1', typename Eval&lt;One,  NullEnv&gt;::value,                 Bind&lt;'2', typename Eval&lt;Two,  NullEnv&gt;::value,                 Bind&lt;'U', typename Eval&lt;Unchurch,                                         Bind&lt;'I', Succ,                                         Bind&lt;'O', Zero,                                             NullEnv&gt;&gt;                                     &gt;::value,                     NullEnv&gt;&gt;&gt;&gt;          &gt;::value Result;      std::cout &lt;&lt; Result::interpretation; } <\/code><\/pre>\n<p>  \u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430. \u0415\u0441\u043b\u0438 \u0431\u044b \u044d\u0442\u043e \u0431\u044b\u043b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441 \u043b\u0438\u043d\u043a\u0435\u0440\u043e\u043c, \u0442\u043e \u0442\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0431\u044b \u043b\u0435\u0436\u0430\u0442\u044c <i>\u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435<\/i> \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u00ab\u043f\u0440\u0435\u0434\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u043c\u00bb \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u2014 \u0443\u0436\u0435 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 <code>Eval<\/code>.<\/p>\n<p>  \u0415\u0449\u0451 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 <code>Unchurch<\/code>. \u041e\u043d\u0438 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0431\u0435\u0437\u043e \u0432\u0441\u044f\u043a\u0438\u0445 <code>Inj<\/code> \u0432\u043e\u043a\u0440\u0443\u0433. \u042d\u0442\u043e \u0442\u043e\u0436\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. <code>Inj<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0445 <i>\u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c<\/i> (\u0432 \u043b\u044f\u043c\u0431\u0434\u0430-\u0442\u0435\u0440\u043c\u0430\u0445).<\/p>\n<p>  <\/p>\n<h3>\u041c\u0430\u043a\u0440\u043e\u0441\u044b<\/h3>\n<p><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/4b2\/17b\/8f1\/4b217b8f158b48b18146d087eff74da5.png\" alt=\"Alien Lisp logo\" align=\"left\"\/><br \/>  \u041d\u0438\u043a\u043e\u0433\u043e \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u043b\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c? \u0418 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 <code>Ref&lt;'foo'&gt;<\/code>?<\/p>\n<p>  \u0410 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0447\u0438\u043c, \u0434\u0430\u0436\u0435 \u0432 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044b \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f:<\/p>\n<table>\n<tr>\n<th>\u0414\u043e<\/th>\n<th>\u041f\u043e\u0441\u043b\u0435<\/th>\n<\/tr>\n<tr>\n<td><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/0a1\/d91\/134\/0a1d91134ee34055b9eb7e19437a98df.gif\" alt=\"\u03bbxyz.B\"\/><\/td>\n<td><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/870\/8fc\/f59\/8708fcf59331433d9fb377568965d6a8.gif\" alt=\"\u03bbx.\u03bby.\u03bbz.B\"\/><\/td>\n<\/tr>\n<tr>\n<td><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/22a\/081\/c04\/22a081c04cd94f218c5f6e5055f5f10e.gif\" alt=\"(f x y z)\"\/><\/td>\n<td><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/a4f\/31a\/825\/a4f31a825c77440fa854641bfb6f6527.gif\" alt=\"(((f x) y) z)\"\/><\/td>\n<\/tr>\n<\/table>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0442\u0430\u043a\u0438\u0435 \u0436\u0435.<\/p>\n<p>  \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u0431\u0440\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440. \u00ab\u0412\u043d\u0435\u0448\u043d\u0438\u0439\u00bb \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043d\u043e\u0432\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b; \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e. \u041c\u0430\u043a\u0440\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043d\u0430\u0442\u0440\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f\u00bb \u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0432\u044b\u0434\u0430\u0451\u0442 \u0447\u0438\u0441\u0442\u044b\u0439 \u043b\u044f\u043c\u0431\u0434\u0430-\u0442\u0435\u0440\u043c \u2014 \u0442\u0430\u043a \u0436\u0435, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <abbr title=\"Meta-Object Compiler\">MOC<\/abbr> \u0432 Qt.<\/p>\n<h4>\u0414\u0432\u0435 \u0444\u0430\u0437\u044b<\/h4>\n<p>\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432 \u0436\u0438\u0437\u043d\u0438 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0431\u044b\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u2014 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Eval<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u043a \u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u0435\u0449\u0451 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Expand<\/code>. \u0412\u0441\u0451, \u0447\u0442\u043e \u043f\u043e\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 <code>Eval<\/code>, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>Expand<\/code>. \u0412\u0432\u0435\u0434\u0451\u043c \u043d\u043e\u0432\u0443\u044e \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>Compute<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">template &lt;class Exp&gt; struct Expand;  template &lt;class Exp, class Env&gt; struct Compute {     typedef typename Eval&lt;typename Expand&lt;Exp&gt;::result, Env&gt;::value value; }; <\/code><\/pre>\n<p>  <code>Expand<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442. \u0411\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0447\u0451\u0440\u043d\u044b\u0439 \u044f\u0449\u0438\u043a: \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u2014 \u0431\u0435\u0437 \u043d\u0438\u0445. \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u043c\u0430\u043a\u0440\u043e\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h4>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 <code>Expand<\/code>. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u043d\u0435\u043a\u0438\u0435 <code>Lam_<\/code> \u0438 <code>App_<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<table>\n<tr>\n<th>\u0414\u043e<\/th>\n<th>\u041f\u043e\u0441\u043b\u0435<\/th>\n<\/tr>\n<tr>\n<td><code>Lam_&lt;'x', 'y', ..., 'z', B&gt;<\/code><\/td>\n<td><code>Lam&lt;'x', Lam&lt;'y', ..., Lam&lt;'z', B&gt;...&gt;&gt;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>App_&lt;A, B, C, ..., Z&gt;<\/code><\/td>\n<td><code>App&lt;...App&lt;App&lt;A, B&gt;, C&gt;, ..., Z&gt;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>App_&lt;'a', ...&gt;<\/code><\/td>\n<td><code>App_&lt;Ref&lt;'a'&gt;, ...&gt;<\/code><\/td>\n<\/tr>\n<\/table>\n<p>\u0412 C++11 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0430\u0440\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443. \u041e\u0431\u043b\u0430\u0434\u0430\u0442\u0435\u043b\u044f\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 C++03 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u0434\u0430\u0442\u044c \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u044b\u0441\u044f\u0447\u0443 \u0438 \u043e\u0434\u043d\u0443 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e: <code>Lam_2<\/code> \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, <code>Lam_3<\/code> \u0434\u043b\u044f \u0442\u0440\u0451\u0445, <code>App_4<\/code> \u0434\u043b\u044f \u0447\u0435\u0442\u044b\u0440\u0451\u0445, \u0438 \u0442. \u0434. \u041d\u0443, \u0438\u043b\u0438 \u0438\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0435\u0449\u0451 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 C++.<\/p>\n<h6>Lam_<\/h6>\n<p>\u041f\u0440\u0430\u0432\u0434\u0430, \u0434\u0430\u0436\u0435 \u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0421++11 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0435\u0449\u0451 \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u043b\u0438\u0442\u044c. \u041f\u0430\u0447\u043a\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f <code>Lam_<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u00ab\u0434\u0435\u0440\u0436\u0430\u043b\u043a\u0443 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432\u00bb:<\/p>\n<pre><code class=\"cpp\">template &lt;char... Vars&gt; struct Args; template &lt;class Args, class Exp&gt; struct Lam_;  template &lt;char Var, class Exp&gt; struct Expand&lt;Lam_&lt;Args&lt;Var&gt;, Exp&gt;&gt; {     typedef typename Expand&lt;Lam&lt;Var, Exp&gt;&gt;::result result; };  template &lt;char Var, char... Vars, class Exp&gt; struct Expand&lt;Lam_&lt;Args&lt;Var, Vars...&gt;, Exp&gt;&gt; {     typedef Lam&lt;Var, typename Expand&lt;Lam_&lt;Args&lt;Vars...&gt;, Exp&gt;&gt;::result&gt; result; }; <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b <code>Expand<\/code> \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u044f. \u041e\u043d\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b, \u0442\u0430\u043a \u043a\u0430\u043a <code>Expand&lt;...&gt;::result<\/code> <i>\u0432\u0441\u0435\u0433\u0434\u0430<\/i> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u0442\u044b\u043c \u043b\u044f\u043c\u0431\u0434\u0430-\u0442\u0435\u0440\u043c\u043e\u043c <i>\u0431\u0435\u0437<\/i> \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.<\/p>\n<h6>App_<\/h6>\n<p>\u0410 \u0435\u0449\u0451 \u0448\u0430\u0431\u043b\u043e\u043d\u044b C++11 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u0447\u043a\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b-\u0447\u0438\u0441\u043b\u0430 \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b-\u0442\u0438\u043f\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 <code>App_<\/code> \u0431\u0443\u0434\u0435\u0442 \u0434\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430. \u041f\u0435\u0447\u0430\u043b\u044c\u043a\u0430.<\/p>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>App_s<\/code> (\u0434\u043b\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432) \u0438 <code>App_i<\/code> (\u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432) \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u044a\u0451\u043c\u043d\u044b\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u0434 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u044b \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u043b\u0438 \u043f\u0430\u0447\u043a\u043e\u0439 \u0438\u043c\u0451\u043d \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0438\u043b\u0438 \u043f\u0430\u0447\u043a\u043e\u0439 \u043b\u044f\u043c\u0431\u0434\u0430-\u0442\u0435\u0440\u043c\u043e\u0432. \u0418\u043c\u0435\u043d\u0430 \u043d\u0430\u0434\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u0442\u0435\u0440\u043c\u044b. \u0415\u0441\u043b\u0438 \u0431\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u044b C++11 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c map \u0434\u043b\u044f \u043f\u0430\u0447\u0435\u043a, \u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0449\u0435, \u0430 \u0442\u0430\u043a \u043c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. (<i>\u0410 \u043c\u043e\u0436\u0435\u0442, map \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c? Anyone?<\/i>)<\/p>\n<pre><code class=\"cpp\">struct Nil; template &lt;class First, class Rest&gt; struct RefList; <\/code><\/pre>\n<p>  \u0418 \u0435\u0449\u0451 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0447\u043a\u0438 \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0437 \u043f\u0430\u0447\u043a\u0438 \u0438\u043c\u0451\u043d \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u0434\u043e \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 <code>Ref<\/code>:<\/p>\n<pre><code class=\"cpp\">template &lt;char... Vars&gt; struct ToRefList_s;  template &lt;char Var&gt; struct ToRefList_s&lt;Var&gt; {     typedef RefList&lt;Ref&lt;Var&gt;, Nil&gt; result; };  template &lt;char Var, char... Vars&gt; struct ToRefList_s&lt;Var, Vars...&gt; {     typedef RefList&lt;Ref&lt;Var&gt;, typename ToRefList_s&lt;Vars...&gt;::result&gt; result; }; <\/code><\/pre>\n<p>  \u041f\u0430\u0447\u043a\u0443 \u0442\u0435\u0440\u043c\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0432 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0432 \u043d\u0435\u0439 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u043f\u043e\u0437\u0436\u0435.<\/p>\n<pre><code class=\"cpp\">template &lt;class... Exps&gt; struct ToRefList_i;  template &lt;class Exp&gt; struct ToRefList_i&lt;Exp&gt; {     typedef RefList&lt;Exp, Nil&gt; result; };  template &lt;class Exp, class... Exps&gt; struct ToRefList_i&lt;Exp, Exps...&gt; {     typedef RefList&lt;Exp, typename ToRefList_i&lt;Exps...&gt;::result&gt; result; }; <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>App_wrap<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0433\u043e\u0440\u044f\u0447\u043e \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0432\u0441\u0435\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u2014 \u043f\u0435\u0440\u0435\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u041f\u0440\u043e\u043b\u043e\u0433\u0435! \u0422\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u043f\u0438\u0441\u043e\u043a <code>RefList<\/code> \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u00ab\u0441\u043f\u0438\u0441\u043e\u043a\u00bb <code>App<\/code>. \u0415\u0451 \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u0439 \u00ab\u0441\u043f\u0438\u0441\u043e\u043a\u00bb <code>App<\/code>, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u0435\u0449\u0451 \u043d\u0435 \u043f\u0435\u0440\u0435\u0432\u0451\u0440\u043d\u0443\u0442\u0430\u044f \u0447\u0430\u0441\u0442\u044c <code>RefList<\/code>.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 <code>RefList<\/code> \u043d\u0430\u0434\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e \u0432\u0442\u043e\u0440\u043e\u043c\u0443. \u0417\u0430\u0442\u0435\u043c \u043a \u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0430\u0442\u0441\u044f (\u0434\u043e\u0439\u0434\u0451\u043c \u0434\u043e <code>Nil<\/code>).<\/p>\n<pre><code class=\"cpp\">template &lt;class Apps, class RefList&gt; struct App_wrap;  template &lt;class A, class D, class R&gt; struct App_wrap&lt;Nil, RefList&lt;A, RefList&lt;D, R&gt;&gt;&gt; {     typedef typename App_wrap&lt;App&lt;A, D&gt;, R&gt;::result result; };  template &lt;class Apps, class A&gt; struct App_wrap&lt;Apps, RefList&lt;A, Nil&gt;&gt; {     typedef typename App_wrap&lt;App&lt;Apps, A&gt;, Nil&gt;::result result; };  template &lt;class Apps, class A, class D&gt; struct App_wrap&lt;Apps, RefList&lt;A, D&gt;&gt; {     typedef typename App_wrap&lt;App&lt;Apps, A&gt;, D&gt;::result result; };  template &lt;class Apps&gt; struct App_wrap&lt;Apps, Nil&gt; {     typedef Apps result; }; <\/code><\/pre>\n<p>  \u0417\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0435\u0451? \u0414\u0430, \u044d\u0442\u043e \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f.<\/div>\n<\/div>\n<p>\u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u041e\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0432\u0441\u0451 \u0447\u0451\u0440\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0441\u0430\u043c\u0438 \u0435\u0449\u0451 \u0440\u0430\u0437 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 <code>Expand<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.<\/p>\n<pre><code class=\"cpp\">template &lt;char...  Exps&gt; struct App_s; template &lt;class... Exps&gt; struct App_i;  template &lt;char... Exps&gt; struct Expand&lt;App_s&lt;Exps...&gt;&gt; {     typedef typename Expand&lt;                 typename App_wrap&lt;Nil,                     typename ToRefList_s&lt;Exps...&gt;::result             &gt;::result         &gt;::result result; };  template &lt;class... Exps&gt; struct Expand&lt;App_i&lt;Exps...&gt;&gt; {     typedef typename Expand&lt;                 typename App_wrap&lt;Nil,                     typename ToRefList_i&lt;Exps...&gt;::result             &gt;::result         &gt;::result result; }; <\/code><\/pre>\n<p>  <\/p>\n<h6>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435<\/h6>\n<p>\u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435, \u043d\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. \u042d\u043a\u0441\u043f\u0430\u043d\u0434\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u044f\u0437\u044b\u043a\u0430, \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c\u0441\u044f:<\/p>\n<pre><code class=\"cpp\">template &lt;char Var&gt; struct Expand&lt;Ref&lt;Var&gt;&gt; {     typedef Ref&lt;Var&gt; result; };  template &lt;char Var, class Exp&gt; struct Expand&lt;Lam&lt;Var, Exp&gt;&gt; {     typedef Lam&lt;Var, typename Expand&lt;Exp&gt;::result&gt; result; };  template &lt;class Fun, class Arg&gt; struct Expand&lt;App&lt;Fun, Arg&gt;&gt; {     typedef App&lt;typename Expand&lt;Fun&gt;::result,                 typename Expand&lt;Arg&gt;::result&gt; result; }; <\/code><\/pre>\n<p>  \u041a\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 <code>Expand<\/code> \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438 \u0441 <code>Eval<\/code> \u0438 <code>Apply<\/code>, \u0442\u043e\u0442 \u043c\u043e\u043b\u043e\u0434\u0435\u0446.<br \/>  (<a href=\"https:\/\/gist.github.com\/ilammy\/4860e7743fd4fe9693a8\/7ae4451a5378998bedd30988fb7918c00c28697a\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434<\/a> \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.)<\/p>\n<p>  <\/p>\n<h3>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f<\/h3>\n<p><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/80d\/455\/311\/80d455311d334be7b0eea041948d222c.png\" alt=\"Self description\" title=\"The contents of any one panel are dependent on the contents of every panel including itself. The graph of panel dependencies is complete and bidirectional, and each node has a loop. The mouseover text has two hundred and forty-two characters.\" align=\"right\"\/><br \/>  \u0421\u043a\u0430\u0437\u0430\u0432 \u043f\u0440\u043e \u043f\u043e\u043b\u043d\u043e\u0442\u0443 \u043f\u043e \u0422\u044c\u044e\u0440\u0438\u043d\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044f, \u043c\u044b \u043a\u0430\u043a-\u0442\u043e \u043e\u0431\u043e\u0448\u043b\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0432\u0448\u0438\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u043e\u0439. \u0412\u0435\u0434\u044c \u0422\u044c\u044e\u0440\u0438\u043d\u0433-\u043f\u043e\u043b\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c <i>\u0446\u0438\u043a\u043b\u044b<\/i>! \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <font color=\"SlateGray\">(<i>\u0431\u0430\u0440\u0430\u0431\u0430\u043d\u043d\u0430\u044f \u0434\u0440\u043e\u0431\u044c<\/i>)<\/font> \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u0430.<\/p>\n<p>  \u0412 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0442\u0430\u043a \u043a\u0430\u043a \u0443 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043c\u0435\u043d\u0430. \u0414\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>Rec<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043e\u0431\u0435\u043d \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 <code>Lam<\/code>, \u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u2014 \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u0441\u0430\u043c\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u0443\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e.<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e, \u0445\u0438\u0442\u0440\u044b\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u043d\u0430\u0448\u043b\u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 <i>Y-\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440<\/i> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0440\u0430\u0436\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u0430\u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u043e \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445. \u0427\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0438 \u043a\u0430\u043a \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e Y-\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">\/\/ Y = \u03bbf.(\u03bbx.f (x x)) (\u03bbx.f (x x)) typedef Lam&lt;'f', App&lt;Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, App_s&lt;'x', 'x'&gt;&gt;&gt;,                      Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, App_s&lt;'x', 'x'&gt;&gt;&gt;&gt;&gt; Y; <\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0443\u044e \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043d\u0435\u0451 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b: \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435, \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u043f\u043e\u043c\u0435\u0448\u0430\u044e\u0442 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u043f\u0438\u0441\u0438 \u0447\u0438\u0441\u0435\u043b \u0427\u0451\u0440\u0447\u0430. \u0412\u0441\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/gist.github.com\/ilammy\/4860e7743fd4fe9693a8\/1f4dcb66267c0790a284387e780c3a513de8e450\">\u0437\u0434\u0435\u0441\u044c<\/a> (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0430), \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438. (\u0415\u0441\u043b\u0438 \u0432\u044b \u043e\u0441\u0438\u043b\u0438\u043b\u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e.)<\/p>\n<p>  \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0451\u0442\u0435, \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u0438 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 <code>StandardLibrary<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c <i>\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e<\/i> \u0434\u043b\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u0430:<\/p>\n<pre><code class=\"cpp\">\/\/ F = \u03bbfn.if (= n 0) 1 \/\/            (* n (f (- n 1))) typedef Lam_&lt;Args&lt;'f', 'n'&gt;,             App_i&lt;Ref&lt;'?'&gt;, App_s&lt;'=', 'n', '0'&gt;,                 Ref&lt;'1'&gt;,                 App_i&lt;Ref&lt;'*'&gt;, Ref&lt;'n'&gt;,                       App_i&lt;Ref&lt;'f'&gt;, App_s&lt;'-', 'n', '1'&gt;&gt;&gt; &gt; &gt; Fact_gen; <\/code><\/pre>\n<p>  \u041e\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0443\u043d\u0430\u0440\u043d\u043e\u0439 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>f<\/code> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u0430 (\u0443\u0436\u0435 \u043e\u0431\u044b\u0447\u043d\u0443\u044e). \u0420\u043e\u043b\u044c Y-\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>Fact_gen<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>Fact<\/code>, \u0447\u0442\u043e\u0431\u044b <code>App&lt;Fact_gen, Fact&gt;<\/code> \u2261 <code>Fact<\/code> \u2014 \u044d\u0442\u043e \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f: \u00ab\u043d\u0430\u0439\u0442\u0438 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443\u00bb.<\/p>\n<p>  \u041e\u043a\u0435\u0439, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0432 (Y F 1) \u2014 \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b \u0435\u0434\u0438\u043d\u0438\u0447\u043a\u0438:<\/p>\n<pre><code class=\"cpp\">\/* ... *\/  #include &lt;iostream&gt;  int main() {     \/* \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f Y \u0438 Fact_gen *\/      typedef Compute&lt;App&lt;Ref&lt;'U'&gt;,                 App_i&lt;Y, Fact_gen, MakeChurch(1)&gt; &gt;,             StandardLibrary&gt;::value Result;      std::cout &lt;&lt; Result::interpretation; } <\/code><\/pre>\n<p>  <\/p>\n<pre><code>ilammy@ferocity ~\/dev\/tlc $ g++ -std=c++11 lc.cpp 2&gt;&1 | wc -c 64596 <\/code><\/pre>\n<p>  \u041d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0418 \u043b\u043e\u0433 \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0430 64 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u0430. \u041f\u043e\u0447\u0435\u043c\u0443?<\/p>\n<p>  \u0412\u0441\u0451 \u0434\u0435\u043b\u043e \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u041e\u0431\u044b\u0447\u043d\u044b\u0439 Y-\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043d\u0430 <i>\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439<\/i> \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u0412 \u043d\u0451\u043c \u043a\u0443\u0441\u043e\u0447\u0435\u043a <code>f (x x)<\/code> \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 <code>(x x)<\/code> \u0432 \u0442\u0435\u043b\u043e <code>f<\/code>, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>(x x)<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043e (\u0442\u043e\u0436\u0435 \u0441 \u043b\u0435\u043d\u0438\u0432\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439).<\/p>\n<p>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e) \u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u0447\u0442\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u0446\u0438\u043a\u043b\u0443 (\u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0435\u043c\u0443 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u0435\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 x). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 Scheme, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435, \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433, \u0432\u044b\u043f\u043b\u0451\u0432\u044b\u0432\u0430\u0435\u043c\u044b\u0439 gcc, \u0442\u043e \u0442\u0430\u043c \u0442\u0430\u043a \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u0447\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">struct Apply&lt;     Closure&lt;         Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, App&lt;Ref&lt;'x'&gt;, Ref&lt;'x'&gt;&gt;&gt;&gt;,         Bind&lt;'f',             Closure&lt;Fact_gen, StandardLibrary&gt;,             StandardLibrary &gt; &gt;,     Closure&lt;         Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, App&lt;Ref&lt;'x'&gt;, Ref&lt;'x'&gt;&gt;&gt;&gt;,         Bind&lt;'f',             Closure&lt;Fact_gen, StandardLibrary&gt;,             StandardLibrary &gt; &gt; &gt; <\/code><\/pre>\n<p>\u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0438\u043f\u0430 <code>result<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0443\u0432\u0438\u0434\u0435\u043b \u0438 \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u043b \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c (<abbr title=\"temp.inst\">14.7.1\/15<\/abbr>).<\/p>\n<p>  \u0428\u0430\u0431\u043b\u043e\u043d\u044b C++ \u0442\u043e\u0436\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>typename Eval&lt;Exp, Env&gt;::value<\/code> \u0437\u0434\u0435\u0441\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430. \u0418\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 <code>Eval<\/code> \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <code>Exp<\/code> \u0438 <code>Env<\/code>.<\/p>\n<p>  \u0412 \u044f\u0437\u044b\u043a\u0430\u0445 \u0441 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c <i>Z-\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440<\/i> \u2014 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e Y-\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>(x x)<\/code> \u0437\u0430\u0432\u0451\u0440\u043d\u0443\u0442\u043e \u0432 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u0440\u0435\u0436\u0434\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">\/\/ Z = \u03bbf.(\u03bbx.f (\u03bby.x x y)) (\u03bbx.f (\u03bby.x x y)) typedef Lam&lt;'f', App&lt;Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, Lam&lt;'y', App_s&lt;'x', 'x', 'y'&gt;&gt;&gt;&gt;,                      Lam&lt;'x', App&lt;Ref&lt;'f'&gt;, Lam&lt;'y', App_s&lt;'x', 'x', 'y'&gt;&gt;&gt;&gt;&gt;&gt; Z; <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0448\u0438\u0431\u043e\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u043e, \u0440\u0430\u0432\u043d\u043e \u043a\u0430\u043a \u0438 \u0435\u0451 \u043a\u043e\u043d\u0446\u0430. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u0438\u0442\u0440\u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0435\u0433\u043e \u0447\u0442\u043e-\u0442\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c. \u0420\u0430\u0437\u0443\u043c\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0438\u043c \u0447\u0435\u043c-\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u0430.<\/p>\n<p>  \u0421\u0442\u043e\u043f! \u0410 \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u043e\u043e\u0431\u0449\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b \u0441\u0430\u043c \u0432 \u0441\u0435\u0431\u044f? \u0412 \u0441\u043c\u044b\u0441\u043b\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c? \u041f\u043e \u0438\u0434\u0435\u0435, \u0437\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>If<\/code>: \u043a\u043e\u0433\u0434\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u0430 \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u0443, \u0430 \u043d\u0435 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432. \u0410 \u043a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f <code>If<\/code>?<\/p>\n<pre><code class=\"cpp\">typedef Lam_&lt;Args&lt;'c', 't', 'f'&gt;, App_s&lt;'c', 't', 'f'&gt;&gt; If; <\/code><\/pre>\n<p>\u041a\u0430\u043a \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f. \u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0427\u0451\u0440\u0447\u0430\u2026 \u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043e \u043e\u043d\u043e \u0442\u043e\u0436\u0435 \u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u0438! \u041f\u0440\u0438 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 <code>If<\/code> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043e\u0431\u0435 \u0432\u0435\u0442\u043a\u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440.<\/p>\n<p>  \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c Z-\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0443: \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e. \u041e\u0434\u043d\u0430\u043a\u043e, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 <code>If<\/code> \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0435 \u043d\u0430\u0434\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 If \u0432 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0431\u044b\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442. \u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c!<\/p>\n<pre><code class=\"cpp\">template &lt;class Cond, class Then, class Else&gt; struct If;  template &lt;class Cond, class Then, class Else&gt; struct Expand&lt;If&lt;Cond, Then, Else&gt;&gt; {     typedef typename Expand&lt;         App_i&lt;Cond, Lam&lt;'u', Then&gt;,                     Lam&lt;'u', Else&gt;,                     Lam&lt;'u', Ref&lt;'u'&gt;&gt; &gt;     &gt;::result result; }; <\/code><\/pre>\n<p>  \u0421\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>'u'<\/code> \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u043d\u0438 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>Then<\/code> \u0438\u043b\u0438 <code>Else<\/code>. \u0422\u0430\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 (\u0433\u0438\u0433\u0438\u0435\u043d\u044b) \u043d\u0430\u0448\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442. \u0418 \u0432\u043e\u043e\u0431\u0449\u0435, \u0438\u043c\u0451\u043d \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0443 \u043d\u0430\u0441 \u0432\u0435\u0441\u044c\u043c\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0435\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <code>0<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0438 \u0441 \u0447\u0435\u043c \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"cpp\">template &lt;char Var&gt; struct Lookup&lt;Var, NullEnv&gt;;  template &lt;class Env&gt; struct Lookup&lt;0, Env&gt;;  template &lt;char Var, class Val, class Env&gt; struct Lookup&lt;Var, Bind&lt;Var, Val, Env&gt;&gt; {     typedef Val result; }; <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. (<a href=\"https:\/\/gist.github.com\/ilammy\/4860e7743fd4fe9693a8\/57b8ea15d5aa4d3ae3f8ecd16a0ca232838f920e\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434<\/a>.)<\/p>\n<pre><code>ilammy@ferocity ~\/dev\/tlc $ time g++ -std=c++11 lc.cpp -DARG=6  real    0m12.630s user    0m11.979s sys     0m0.466s  ilammy@ferocity ~\/dev\/tlc $ .\/a.out 720 <\/code><\/pre>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u0430 \u0441\u0435\u043c\u0438 \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u0443\u0436\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u0443\u043c\u0438\u0440\u0430\u0435\u0442 \u043e\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430. \u041d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e!..<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/ebd\/8c8\/5a5\/ebd8c85a5938466e84afb89c5f53034b.jpg\" \/><\/div>\n<p>  <\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u044b \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043d\u0435\u0442, \u043d\u043e \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u0438\u0434\u0435\u044f \u0432\u043e\u0441\u0445\u0438\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0430. \u0428\u0430\u0431\u043b\u043e\u043d\u044b C++ \u2014 \u044d\u0442\u043e \u043e\u043d\u0430 \u0438\u0437 \u00ab\u043d\u0435\u0447\u0430\u044f\u043d\u043d\u043e \u0422\u044c\u044e\u0440\u0438\u043d\u0433-\u043f\u043e\u043b\u043d\u044b\u0445\u00bb \u0432\u0435\u0449\u0435\u0439 \u0432 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u043a\u0435. \u0421\u0445\u043e\u0436\u0435\u0435 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u043e \u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u044f \u0443\u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e x86-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0442\u043e\u0436\u0435 \u043f\u043e\u043b\u043d\u0430 \u043f\u043e \u0422\u044c\u044e\u0440\u0438\u043d\u0433\u0443. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 C++, \u0442\u043e MMU \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, <abbr title=\"Design Concepts in Programming Languages\">DCPL<\/abbr> \u044f \u0434\u043e\u0447\u0438\u0442\u0430\u043b \u043f\u043e\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e \u0432\u043e\u0441\u044c\u043c\u043e\u0439 \u0433\u043b\u0430\u0432\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 <i>\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e<\/i> \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f. \u0423 \u043c\u0435\u043d\u044f \u043f\u043e\u043a\u0430 \u0435\u0449\u0451 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u0430\u0431\u0430\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e.<\/p>\n<p>  <i>P.S. \u0412\u0441\u0451 \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u043a\u0430 \u044f \u043f\u0438\u0441\u0430\u043b \u043f\u043e\u0441\u0442, \u043c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u043b\u0430 \u043c\u044b\u0441\u043b\u044c: \u00ab\u042d\u0442\u043e \u0438\u043b\u0438 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u0411\u0443\u0441\u0442\u0435, \u0438\u043b\u0438 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0442\u0430\u043c \u0432 \u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u0438\u00bb.<\/i>    \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/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=\"http:\/\/habrahabr.ru\/post\/218341\/\"> http:\/\/habrahabr.ru\/post\/218341\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/7d6\/4b7\/f83\/7d64b7f83b4d78f198856db9039c3978.jpg\" alt=\"Yo dawg, I heard you like programming. So we put a language in you language, so you can program while you program\" align=\"right\"\/>\u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0441\u043a\u043e\u0447\u0438\u043b\u0430 <a href=\"http:\/\/habrahabr.ru\/post\/218229\/\">\u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043f\u0440\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 C++ \u043e\u0442 <a href=\"http:\/\/habrahabr.ru\/users\/hurrthedurr\/\" class=\"user_link\">HurrTheDurr<\/a>. \u0412 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043a \u043d\u0435\u0439 \u043b\u0438\u0447\u043d\u043e \u044f \u0443\u0432\u0438\u0434\u0435\u043b \u0432\u044b\u0437\u043e\u0432:<\/p>\n<p>  <font color=\"DimGray\">&gt; \u0421 \u043a\u0430\u0436\u0434\u044b\u043c \u043d\u043e\u0432\u044b\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0432\u0438\u0445\u043d\u0443\u0442\u044c \u0441\u0435\u0431\u0435 \u043c\u043e\u0437\u0433 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0421++ \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f)<br \/>  &gt; &gt; \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435 \u043d\u0430\u0434 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438, \u0430 \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438.<\/font><\/p>\n<p>  \u0410 \u0442\u0430\u043a \u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u0438\u043f\u0430\u0445, \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0447\u0435\u043c \u043a\u043b\u0435\u0442\u043e\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442? \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e; \u044f \u0432 30 \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043d\u0430 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e, \u0447\u0435\u043c \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u043e\u0434\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044f.<\/p>\n<p>  \u0427\u0443\u0442\u044c \u0440\u0430\u043d\u044c\u0448\u0435 <a href=\"http:\/\/habrahabr.ru\/users\/avenat\/\" class=\"user_link\">AveNat<\/a> \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0430 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <a href=\"http:\/\/habrahabr.ru\/post\/215807\/\">\u0432 \u0434\u0432\u0443\u0445<\/a> <a href=\"http:\/\/habrahabr.ru\/post\/215991\">\u0447\u0430\u0441\u0442\u044f\u0445<\/a>, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e (\u043e\u0431\u0440\u0430\u0437\u043d\u043e) \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">#include &lt;iostream&gt;  #include &lt;LC\/kernel.h&gt; #include &lt;LC\/church_numerals.h&gt;  int main() {     \/\/ \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0432 \u0432\u0438\u0434\u0435 \u043b\u044f\u043c\u0431\u0434\u0430-\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439     typedef ChurchEncode&lt;2&gt; Two;    \/\/ 2 = \u03bbfx.f (f x)     typedef ChurchEncode&lt;3&gt; Three;  \/\/ 3 = \u03bbfx.f (f (f x))      \/\/ * = \u03bbab.\u03bbf.a (b f)     typedef Lambda&lt;'a', Lambda&lt;'b', Lambda&lt;'f',                 Apply&lt;Var&lt;'a'&gt;, Apply&lt;Var&lt;'b'&gt;, Var&lt;'f'&gt; &gt; &gt;         &gt; &gt; &gt; Multiply;      \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 (* 2 3)     typedef Eval&lt;Apply&lt;Apply&lt;Multiply, Two&gt;, Three&gt;&gt; Output;      \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043e\u0442 \u043b\u044f\u043c\u0431\u0434\u0430-\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u043a \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u0430\u043c     typedef ChurchDecode&lt;Output&gt; Result;      std::cout &lt;&lt; Result::value; } <\/code><\/pre>\n<p>  \u0410 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code>ilammy@ferocity ~ $ gcc cpp.cpp ilammy@ferocity ~ $ .\/a.out 6 <\/code><\/pre>\n<p>  \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u043e\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0448\u0442\u0443\u043a\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f. \u0418 \u0435\u0449\u0451 \u043e\u043d\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0437\u043d\u0430\u043d\u0438\u0439 \u043e \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438. \u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u043e\u0431\u0437\u043e\u0440\u043e\u0432, \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u0437\u043d\u0430\u043d\u0438\u044f C++ (\u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438), \u0438 \u0437\u0434\u0440\u0430\u0432\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e.<\/p>\n<p>  \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0422\u044c\u044e\u0440\u0438\u043d\u0433-\u043f\u043e\u043b\u043d\u043e\u0442\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 C++ \u0432 \u0432\u0438\u0434\u0435 compile-time \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0431\u0435\u0441\u0442\u0438\u043f\u043e\u0432\u043e\u0433\u043e \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f (\u043f\u043b\u044e\u0441 \u043f\u0435\u0447\u0435\u043d\u044c\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438).<\/p>\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-218341","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/218341","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=218341"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/218341\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=218341"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=218341"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=218341"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}