{"id":470041,"date":"2025-08-08T15:00:16","date_gmt":"2025-08-08T15:00:16","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=470041"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=470041","title":{"rendered":"<span>GIMP Script-Fu \u041e\u041e\u041f. \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0418\u0437\u044e\u043c\u0438\u043d\u043a\u0430 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><a href=\"https:\/\/gitflic.ru\/project\/nuinu\/gimp-script-fu-ext\" rel=\"noopener noreferrer nofollow\">\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043a Script-fu<\/a><\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <code>obj4.scm<\/code> \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0440\u0430\u043d\u0435\u0435, \u043c\u0435\u043d\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b\u0430. \u042f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0442\u0430\u043c \u0432\u0441\u0451 \u0447\u0442\u043e \u0445\u043e\u0442\u0435\u043b \u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b: <strong>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/strong> \u0438 <strong>\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/strong>,  <strong>\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435<\/strong>, <strong>\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430<\/strong>. \u041d\u043e \u0432\u043e\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u0437\u0451\u0440\u043d\u044b\u0448\u043a\u043e \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u044f, \u043c\u0435\u0448\u0430\u043b\u043e \u043c\u0435\u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442. \u0410 \u0432\u0441\u0451 \u043b\u0438 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043b\u044f <strong>\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b<\/strong> \u0441\u0438\u0441\u0442\u0435\u043c\u044b? \u0418 \u0434\u0435\u043b\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043b\u044e\u0434\u0438 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 GIMP\u0430 \u043e\u0431\u0440\u0435\u0437\u0430\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f Script-fu \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043d\u0435 \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0445\u0435\u0448-\u043a\u043e\u0434 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432(\u0430 \u0442\u043e \u0438 \u0432\u043e\u0432\u0441\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0438\u0448\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439). \u041d\u0435\u0442. \u0414\u043b\u044f \u0441\u0435\u0431\u044f \u044f \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e Script-fu \u0438 \u0431\u0443\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439 tinyscheme. \u041d\u043e <strong>\u0447\u0442\u043e<\/strong> \u0436\u0435 \u043c\u043e\u0436\u043d\u043e <strong>\u0441\u0434\u0435\u043b\u0430\u0442\u044c<\/strong> \u0435\u0449\u0451, <strong>\u0447\u0442\u043e\u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c<\/strong> \u0440\u0430\u0431\u043e\u0442\u044b <strong>\u041e\u041e \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/strong>?<\/p>\n<p>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u043e\u043b\u044f\u043c(\u0441\u043b\u043e\u0442\u0430\u043c) \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 <code>vfield<\/code>, \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044e, \u0442.\u043a., <strong>\u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043c\u0435\u0442\u043e\u0434\u0430<\/strong>(<em>\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0439<\/em> \u0438\u043b\u0438 \u043e\u0434\u0438\u043d <em>\u0438\u0437<\/em> \u0435\u0433\u043e<em> \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432<\/em>). \u0410 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u0442.\u043a <strong>\u043f\u043e\u043b\u044f \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/strong>(\u0438 \u044f \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0435 \u0441\u0442\u0440\u0435\u043c\u0438\u043b\u0441\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435, <strong>\u0442.\u043a \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435<\/strong> \u043f\u043e\u043b\u043e\u043c\u0430\u043b\u043e \u0431\u044b \u043b\u044e\u0431\u0443\u044e \u0441\u0445\u0435\u043c\u0443). \u0412 \u043f\u0438\u0442\u043e\u043d\u0435, \u0434\u0436\u0430\u0432\u0430\u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0441 \u044d\u0442\u0438\u043c \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0443 \u043d\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u0442\u043e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438 \u043d\u0438\u043a\u0443\u0434\u0430 \u043e\u0442 \u043d\u0438\u0445 \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0435\u0442\u044c\u0441\u044f, \u0430 \u0443 \u043d\u0430\u0441 \u0432\u0435\u043a\u0442\u043e\u0440!<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u044f \u043f\u043e\u043d\u044f\u043b \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0441\u0432\u043e\u0438\u0445 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0439! \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e \u0442\u0438\u043f\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432(\u043d\u0430 \u044d\u0442\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u044f \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435). \u0422.\u0435 \u044f <strong>\u0432\u0441\u0435\u0433\u0434\u0430 \u0447\u0451\u0442\u043a\u043e \u0437\u043d\u0430\u044e \u0441 \u043a\u0430\u043a\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0442\u0438\u043f\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d<\/strong> \u0442\u043e\u0442 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439<strong> \u043c\u0435\u0442\u043e\u0434<\/strong>, \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0410 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445<strong> \u041c\u041e\u0416\u041d\u041e<\/strong>(\u0438 \u0434\u0430\u0436\u0435 \u043d\u0443\u0436\u043d\u043e) <strong>\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 <\/strong>\u0444\u0443\u043d\u043a\u0446\u0438\u0438(\u0430 \u0432\u0435\u0440\u043d\u0435\u0435 \u0434\u0430\u0436\u0435 <strong>\u043c\u0430\u043a\u0440\u043e\u0441\u044b<\/strong>) <strong>\u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u043b\u044f\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/strong>. \u0410 \u044d\u0442\u043e \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u043f\u044b\u0442\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u043c\u0430\u043a\u0440\u043e\u0441 <code>with-slots<\/code>, \u043b\u0438\u0448\u044c \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438, \u0442.\u043a \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0440\u0435\u0434\u043a\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043f\u043e\u043b\u044e.<\/p>\n<p>\u041d\u043e \u043f\u043e\u043a\u0430 \u043d\u0430\u0448\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e\u0442\u043e\u043c\u043a\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u0410 \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u043e\u0433\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u043b\u044e \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c <strong>\u0428\u0410\u0411\u041b\u041e\u041d\u041d\u042b\u0419 \u043a\u043e\u0434<\/strong>, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434, \u0430 \u0448\u0430\u0431\u043b\u043e\u043d \u043a\u043e\u0434\u0430, \u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/strong>, \u043c\u044b \u044d\u0442\u0438 <strong>\u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432 \u043a\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432<\/strong>, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0441 <strong>\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/strong>. \u0417\u0434\u0435\u0441\u044c \u044f \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u043b \u0430\u043c\u0435\u0440\u0438\u043a\u0443. \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u044e\u0442 \u0432 \u0421++. \u0414\u0430 \u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u044e \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438, \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0443 \u043a\u043e\u0434\u0430 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0432\u0435\u0434\u044c \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<strong> \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0440\u0430\u043d\u0435\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432<\/strong> \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0417\u0430\u0442\u043e \u0441\u0430\u043c \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u0439(\u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430).<\/p>\n<p>\u043d\u0443 \u0430 <strong>\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/strong> \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0442\u043e\u0442 \u0436\u0435<strong> Dot \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/strong> \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0439 \u043c\u043d\u043e\u0439 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f.<\/h2>\n<p>\u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 <code>defgeneric<\/code> \u0438 <code>defmethod<\/code> \u041d\u0415 \u0418\u0417\u041c\u0415\u041d\u0418\u041b\u0418\u0421\u042c. \u0422\u0430\u043a \u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b\u0438 \u0438 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041f\u043e\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043e\u0434\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/p>\n<pre><code class=\"lisp\">(define (build-applicable-methods methods shablon)   (let* ((shablon-parents (build-shablon-parents shablon))  (acceptable-methods-primary (build-acceptable-method-list (qualifier-methods-primary methods) shablon-parents))  (acceptable-methods-before  (build-acceptable-method-list (qualifier-methods-before  methods) shablon-parents))  (acceptable-methods-after   (build-acceptable-method-list (qualifier-methods-after   methods) shablon-parents))  (acceptable-methods-around  (build-acceptable-method-list (qualifier-methods-around  methods) shablon-parents))  (compare-func (make-compare-shablon-call shablon-parents))  (rez (qualifier-methods! '() '() '() '())))     (qualifier-methods-around!  rez (build-concrete-methods-list-primary-by-shablon  (sort-c compare-func acceptable-methods-around) shablon))     (qualifier-methods-before!  rez (build-concrete-methods-list-by-shablon          (sort-c compare-func acceptable-methods-before) shablon))     (qualifier-methods-primary! rez (build-concrete-methods-list-primary-by-shablon  (sort-c compare-func acceptable-methods-primary) shablon))     (qualifier-methods-after!   rez (build-concrete-methods-list-by-shablon (reverse (sort-c compare-func acceptable-methods-after)) shablon))     rez)) <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>;\u043a\u0430\u043a\u043e\u0439 \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u0432 obj4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define (build-applicable-methods methods shablon)   (let* ((shablon-parents (build-shablon-parents shablon))  (acceptable-methods-primary (build-acceptable-method-list (qualifier-methods-primary methods) shablon-parents))  (acceptable-methods-before  (build-acceptable-method-list (qualifier-methods-before  methods) shablon-parents))  (acceptable-methods-after   (build-acceptable-method-list (qualifier-methods-after   methods) shablon-parents))  (acceptable-methods-around  (build-acceptable-method-list (qualifier-methods-around  methods) shablon-parents))  (compare-func (make-compare-shablon-call shablon-parents))  (rez (qualifier-methods! '() '() '() '())))     (qualifier-methods-around!  rez (sort-c compare-func acceptable-methods-around))     (qualifier-methods-before!  rez (sort-c compare-func acceptable-methods-before))     (qualifier-methods-primary! rez (sort-c compare-func acceptable-methods-primary))     (qualifier-methods-after!   rez (reverse (sort-c compare-func acceptable-methods-after)))     rez))<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422.\u0435 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u0443 \u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0432\u044b\u0437\u043e\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439: <code>build-concrete-methods-list-primary-by-shablon<\/code> \u0438 <code>build-concrete-methods-list-by-shablon<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0432 \u043a\u043e\u0434 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<pre><code class=\"lisp\">(define-m (build-concrete-methods-list-by-shablon methods shablon)   (map (lambda (m) (list (car m) (build-concrete-method-by-shablon (cadr m) shablon))) methods))  (define-m (build-concrete-methods-list-primary-by-shablon methods shablon)   (map (lambda (m) (list (car m) (build-concrete-method-primary-by-shablon (cadr m) shablon))) methods)) <\/code><\/pre>\n<p>\u0410 \u043e\u043d\u0438 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"lisp\">(define-m (build-concrete-method-by-shablon method shablon)   (let ((code      (get-closure-code method)))     (eval (our-macro-expand1 (list 'lambda (cadr code)                               (tree-expr-replace-vars-dot-fields (caddr code)                                                                  (make-var-stru-by-shablon (cadr code) shablon)))))))  ;;\u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434(\u0438 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u0439) \u0438\u043c\u0435\u0435\u0442 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0435\u0437\u0430\u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442!!! \u043e\u043d \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d! (define-m (build-concrete-method-primary-by-shablon method shablon)   (let ((code      (get-closure-code method)))     (eval (our-macro-expand1 (list 'lambda (cadr code)                               (tree-expr-replace-vars-dot-fields (caddr code)                                                                  (make-var-stru-by-shablon (cdr (cadr code)) shablon))))))) (define-m (make-var-stru-by-shablon args shablon)   (let ((rez '()))     (do ((cur-args    args    (cdr cur-args))          (cur-shablon shablon (cdr cur-shablon)))         ((or (null? cur-args) (null? cur-shablon))  (reverse rez))       (unless (eq? (car cur-shablon) :unspec)         (set! rez (cons (var-stru-def! (car cur-args) (car cur-shablon)) rez)))))) <\/code><\/pre>\n<p>\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u0434 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>make-var-stru-by-shablon<\/code> \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0443\u044e \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u0434\u043e\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 <code>with-stru<\/code>! \u041d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e: <code>tree-expr-replace-vars-dot-fields<\/code> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043c\u0435\u043d\u044b \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u0444\u0443\u043d\u043a\u0446\u0438\u044f tree-expr-replace-vars-dot-fields<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define-m (tree-expr-replace-vars-dot-fields expr var-list)    (let ((aliases     (make-hash 16))          (tree-expr-replace-get-set-rec #f)          (is-alias-fields #f)          (fd              #f) ;;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f          (in-var-list (lambda (var var-list) (find (lambda (x) (eq? ( var-stru-def-var x ) var)) var-list)))          (exclude-params (lambda (var-list params)                             (remove-if (lambda (var)                                           (cdr (find (lambda (elem) (eq? (var-stru-def-var var) elem)) params))) var-list))))       (set! is-alias-fields          (lambda (expr var-list)             (if (symbol? expr)                 (let ((rez (hash-ref aliases expr))) ;;\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0445\u0435\u0448.                    (if (car rez)                        (cdr rez) ;;\u0432\u0435\u0440\u043d\u0451\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043e\u043d \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f get \u0438 set                        (let ((var-field (split-dot-symbol expr))) ;;\u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \"\u0440\u0430\u0437\u0431\u0438\u0442\u044c\" \u0441\u0438\u043c\u0432\u043e\u043b.                           (if var-field                               (let ((in-var (in-var-list (car var-field)  var-list)))                                  (if (cdr in-var)                                      (let* ((getter-name  (make-symbol                                                            (var-stru-def-type (car in-var))                                                            \"-\" (cdr var-field)))                                             (setter-name  (make-symbol                                                            (var-stru-def-type (car in-var))                                                            \"-\" (cdr var-field) \"!\"))                                             (fd (field-def! expr (cdr var-field) (car var-field)                                                             getter-name                                                             setter-name)))                                         (hash-set! aliases expr fd)                                         fd);;\u0432\u0435\u0440\u043d\u0451\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f                                      #f)) ;;\u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0448\u0430 \u043f\u0430\u0440\u0430!!! \u043c\u044b \u0442\u0430\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438!                               #f))));;\u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 \u043f\u0430\u0440\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f-\u043f\u043e\u043b\u0435                 #f))) ;;\u044d\u0442\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u0441\u0438\u043c\u0432\u043e\u043b!       (set! tree-expr-replace-get-set-rec          (lambda (expr var-list)              (cond ((null? expr) '())                   ((lambda? expr) ;;\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u043b\u044f\u043c\u0431\u0434\u0435 \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0438, \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e                    (let* ((params  (lambda-parameters expr))                           (local-var-list (exclude-params var-list params)))                       (if (null? local-var-list)                           expr ;;\u043d\u0435\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 var-list, \u0434\u0430\u043b\u044c\u0448\u0435 \u0437\u0430\u043c\u0435\u043d\u0443 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c                           (make-lambda params ;;\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c\u0438, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0445 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c                                        (tree-expr-replace-get-set-rec (lambda-body expr) local-var-list)))                       ))                   ((begin                       (set! fd (is-alias-fields expr var-list))                       fd)                    (list (field-def-name-get fd) (tree-expr-replace-get-set-rec (field-def-var fd) var-list)))                   ((and (pair? expr)   ;;(list? expr)                         (= (length expr) 3)                         (eq? 'set! (car expr))                         (begin                            (set! fd (is-alias-fields (cadr expr) var-list))                            fd))                    (list (field-def-name-set fd)                          (tree-expr-replace-get-set-rec (field-def-var fd) var-list)                          (tree-expr-replace-get-set-rec (caddr expr) var-list)))                   ((pair? expr) ;;(list? expr)                    (cons (tree-expr-replace-get-set-rec (car expr) var-list)                          (tree-expr-replace-get-set-rec (cdr expr) var-list)))                   (#t                    expr))))       (let ((rez (tree-expr-replace-get-set-rec expr var-list)))          rez)       )) <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0432\u043e\u0442 \u0438<strong> \u0412\u0421\u0401<\/strong>!!! \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441.<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b.<\/h2>\n<details class=\"spoiler\">\n<summary>\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">;;(define path-home \"D:\") (define path-home (getenv \"HOME\")) (define path-lib (string-append path-home \"\/work\/gimp\/lib\/\")) (define path-work (string-append path-home \"\/work\/gimp\/\")) (load (string-append path-lib \"util.scm\")) (load (string-append path-lib \"defun.scm\")) (load (string-append path-lib \"struct2.scm\")) (load (string-append path-lib \"storage.scm\")) (load (string-append path-lib \"cyclic.scm\")) (load (string-append path-lib \"hashtable3.scm\")) ;;\u0445\u0435\u0448 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0435\u0439! (load (string-append path-lib \"sort2.scm\")) (load (string-append path-lib \"tsort.scm\")) ;;(load (string-append path-lib \"cpl-sbcl.scm\")) (load (string-append path-lib \"cpl-mro.scm\")) ;;(load (string-append path-lib \"cpl-topext.scm\")) (load (string-append path-lib \"struct2ext.scm\")) (load (string-append path-lib \"queue.scm\")) (load (string-append path-lib \"obj5.scm\")) (load (string-append path-lib \"obj\/object.scm\")) <\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u041f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441 \u043e\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439.<\/h2>\n<pre><code class=\"lisp\">(defclass Test (Object)   ((v1 5))   (shared-val))  (define t1 (make-Test)) (define t2 (make-Test :v1 12)) (sfield! t1 :shared-val 123) (sfield! t2 :shared-val 321)  (sfield t1 :shared-val) ;321 ;;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443 \u0434\u043b\u044f t2 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u0435\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0438 \u0434\u043b\u044f t1 <\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>to-s<\/code> \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <code>Test<\/code><\/p>\n<pre><code class=\"lisp\">(defmethods Test   (to-s ()                                ;;      v----- \u0432\u043e\u0442 \u043e\u043d \u0414\u043e\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u043b\u044f\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430!!!         (join-to-str (call-next-method) \" v1: \" self.v1 \", shared-val: \" self.shared-val))   )  (to-s t1) ;;\"#Test[:v1: 5] v1: 5, shared-val: 321\" (to-s t2) ;;\"#Test[:v1: 12] v1: 12, shared-val: 321\" <\/code><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u0442\u043e <strong>\u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438<\/strong> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430\u0448\u0438\u0445 \u0442\u0440\u0443\u0434\u043e\u0432, <strong>\u0434\u043e\u0442-\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/strong> \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u043a \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430.  \u041a\u0430\u043a \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438?<\/p>\n<pre><code class=\"lisp\">(get-closure-code (cadar (qualifier-methods-primary (cdr (to-s-get-methods '(Test)))))) ;; (lambda (gensym-552 self) ;;   (let* ((next-method-p (lambda () (not (null? (qm-get gensym-552 :primary))))) ;;  (call-next-method (lambda () (call-methods-rec gensym-552 self)))) ;;     (join-to-str (call-next-method) \"v1: \" (vector-ref self 1) \", shared-val: \" (Test-shared-val self))))  (get-closure-code Test-shared-val) ;;(lambda (gensym-470) (vector-ref Test 0)) <\/code><\/pre>\n<p>\u0413\u0434\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>to-s-get-methods<\/code> \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>to-s<\/code>, \u0430 <code>qualifier-methods-primary<\/code> &#8212;  \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u0430\u043a \u0433\u0435\u0442\u0442\u0435\u0440 \u0434\u043b\u044f \u043f\u043e\u043b\u044f <code>primary<\/code> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>qualifier-methods<\/code>.<\/p>\n<h2>\u041f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f &#171;\u0441\u043c\u0435\u0440\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u043e\u043c\u0431\u0430&#187;.<\/h2>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0447\u0435\u0442\u044b\u0440\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u0445 \u0440\u043e\u043c\u0431\u043e\u0432\u0438\u0434\u043d\u043e\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u0443 \u0438 \u0434\u043e \u043a\u0443\u0447\u0438 \u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0443\u043a\u0430\u0436\u0435\u043c \u043e\u0434\u043d\u0443 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e.<\/p>\n<pre><code class=\"lisp\">(defclass Test1 (Object)   (v11 v12)   (shared-val))  (defclass Test2 (Test1)   ((v21 121) (v22 122)))  (defclass Test3 (Test1)   ((v31 331)))  (defclass Test4 (Test3 Test2)   (v41))  (define t1 (make-Test1 :v11 12 :v12 13)) (define t2 (make-Test4 :v11 41 :v12 42 :v41 141 :v22 1)) (sfield! t1 :shared-val 123) (sfield! t2 :shared-val 421) (sfield! 'Test2 :shared-val 221) (sfield! 'Test3 :shared-val 321)  (sfield t2 :shared-val) ;421 - \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443. <\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c (\u043e\u043d \u0443\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 Object) \u043c\u0435\u0442\u043e\u0434 <code>to-s<\/code> \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>Test1<\/code> \u0438 \u043f\u0430\u0440\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432.<\/p>\n<pre><code class=\"lisp\">(defmethods Test1   (to-s ()       (join-to-str (call-next-method) \" ,v11: \" self.v11 \", v21: \"  self.v12 \", shared-val: \" self.shared-val))   )  (define t12 (make-Test2 :v11 212 :v12 213))  (define t13 (make-Test3 :v11 312 :v12 313))  <\/code><\/pre>\n<p>\u0418\u0441\u043f\u044b\u0442\u0430\u0435\u043c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434, \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f <code>Object<\/code>, \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u0410 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <code>Test1<\/code> \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043c \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 \u043d\u0451\u043c.<\/p>\n<pre><code class=\"lisp\">(for-list (t (list t1 t12 t13 t2))     (prn (to-s t) \"\\n\"))  ;; #Test1[:v11: 12, :v12: 13] ,v11: 12, v21: 13, shared-val: 123 ;; #Test2[:v11: 212, :v12: 213, :v21: 121, :v22: 122] ,v11: 212, v21: 213, shared-val: 221 ;; #Test3[:v11: 312, :v12: 313, :v31: 331] ,v11: 312, v21: 313, shared-val: 321 ;; #Test4[:v11: 41, :v12: 42, :v21: 121, :v22: 1, :v31: 331, :v41: 141] ,v11: 41, v21: 42, shared-val: 421 <\/code><\/pre>\n<p>\u0418\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0441 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u044c, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <code>Test4<\/code> \u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<pre><code class=\"lisp\">(defmethods Test4   (to-s () (join-to-str \"v11: \"   self.v11 \", v21: \"  self.v12      \", v21: \" self.v21 \", v31: \"  self.v31      \", v41: \" self.v41 \", shared-val: \" self.shared-val))   )   (for-list (t (list t1 t12 t13 t2))     (prn (to-s t) \"\\n\")) ;; #Test1[:v11: 12, :v12: 13] ,v11: 12, v21: 13, shared-val: 123 ;; #Test2[:v11: 212, :v12: 213, :v21: 121, :v22: 122] ,v11: 212, v21: 213, shared-val: 221 ;; #Test3[:v11: 312, :v12: 313, :v31: 331] ,v11: 312, v21: 313, shared-val: 321 ;; v11: 41, v21: 42, v21: 121, v31: 331, v41: 141, shared-val: 421 <\/code><\/pre>\n<p>\u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0432\u0438\u0434\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <code>Test4<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u044f\u0442\u044c \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c,  \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u044b\u043b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(get-closure-code (cadar (qualifier-methods-primary (cdr (to-s-get-methods '(Test4)))))) ;; (lambda (gensym-479 self) ;;   (let* ((next-method-p (lambda () (not (null? (qm-get gensym-479 :primary))))) ;;     (call-next-method (lambda () (call-methods-rec gensym-479 self)))) ;;     (join-to-str \"v11: \"   (vector-ref self 3)   \", v21: \"        (vector-ref self 2) ;;     \", v21: \" (vector-ref self 1)   \", v31: \"        (vector-ref self 5) ;;     \", v41: \" (vector-ref self 4)   \", shared-val: \" (Test4-shared-val self)))) <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c \u043a\u043e\u0434\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043a \u043f\u043e\u043b\u044f\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445 \u0431\u044b \u0442\u043e \u043d\u0438\u0431\u044b\u043b\u043e \u043f\u043e\u0438\u0441\u043a\u043e\u0432 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445.<\/p>\n<h2>\u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f.<\/h2>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u044f \u0432\u0437\u044f\u043b \u0438\u0437 \u0432\u0438\u0434\u0435\u043e \u0440\u043e\u043b\u0438\u043a\u0430 &#171;<strong>\u041e\u041e\u041f \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445<\/strong>&#171;. \u0421\u0430\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0430\u043a\u0438 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439, \u043d\u043e \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u0442\u0440\u0451\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432: <strong>Personal, Employee, Developer<\/strong>.<\/p>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c <strong>\u043a\u043b\u0430\u0441\u0441 Personal<\/strong> \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<pre><code class=\"lisp\">(defclass Person (Object)   (first-name last-name age))   (defmethods Person   (change  (data)      (let ((parsed (keyargs-to-pairs data)))        (awhen (assq :first-name parsed) (set! self.first-name (cdr it)))        (awhen (assq :last-name parsed)  (set! self.last-name  (cdr it)))        (awhen (assq :age parsed)    (set! self.age  (if (&amp;lt; (cdr it) 0)                (let ((delta (+ self.age (cdr it))))                   (if (&amp;lt; delta 0) 0 delta))                (cdr it))))        )      self)   ) <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0447\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>change<\/code>? \u0427\u0442\u043e \u0431\u044b <strong>\u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/strong>. \u041d\u0435\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0431\u0435\u0437 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u043e \u044d\u0442\u043e <code>\u043d\u0435 \u0445\u043e\u0440\u043e\u0448\u043e<\/code>. \u0410\u0439-\u044f\u0439-\u044f\u0439! \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c. \u0412 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0431\u044b\u0432\u0430\u0435\u0442 <strong>\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u044f\u043c\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439<\/strong> \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430.  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u0438 \u0438\u043c\u0435\u044e\u0449\u0435\u0439\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043f\u043e\u043b\u044f \u043f\u043b\u043e\u0449\u0430\u0434\u0438. \u0422\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u044e\u0442 \u043d\u0430 \u0430\u0446\u0446\u0435\u0441\u0441\u043e\u0440\u044b, \u0432\u0435\u0440\u043d\u0435\u0435 \u0441\u0435\u0442\u0442\u0435\u0440\u044b. \u041d\u043e \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0438\u0431\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u0447\u0451\u0442 \u044d\u0442\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u0438, \u043d\u043e \u0432\u0435\u0434\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u0442\u0440\u0438 \u0442\u043e\u0447\u043a\u0438, \u0430 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0432\u044b\u0437\u0432\u0430\u0432 \u0441\u0435\u0442\u0442\u0435\u0440\u044b, \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0442\u0440\u043e\u0439\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0441\u0447\u0451\u0442 \u043f\u043b\u043e\u0449\u0430\u0434\u0438. \u0418 \u0442\u043e \u0447\u0442\u043e \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0438\u0434\u0435\u0435\u0439 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430(\u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u0442\u0435\u0440\u044b) \u043e\u0431\u0435\u0440\u043d\u0451\u0442\u0441\u044f \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043b\u0438\u0448\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439. <strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430, \u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u0430 \u043b\u0438\u0448\u044c \u0432 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445.<\/strong><\/p>\n<p>\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>change<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 <strong>\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f<\/strong> \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u043d\u0430\u0432\u0435\u0441\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438\u043b\u0438 \u043d\u0430 \u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<details class=\"spoiler\">\n<summary>\u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define p1 (make-Person :age 31 :first-name \"\u0412\u0430\u0441\u044f\" :last-name \"\u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432\")) (to-s p1) ;;\"#Person[:age: 31, :first-name: \u0412\u0430\u0441\u044f, :last-name: \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432]\"  (change p1 (list :age -5 :first-name \"\u0421\u0430\u0448\u0430\")) (to-s p1) ;;\"#Person[:age: 26, :first-name: \u0421\u0430\u0448\u0430, :last-name: \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432]\"  (change p1 (list :age -55 :last-name \"\u0421\u0438\u0434\u043e\u0440\u043e\u0432\")) (to-s p1) ;;\"#Person[:age: 0, :first-name: \u0421\u0430\u0448\u0430, :last-name: \u0421\u0438\u0434\u043e\u0440\u043e\u0432]\"  (to-s (change p1 (list :age 25))) ;;#Person[:age: 25, :first-name: \u0421\u0430\u0448\u0430, :last-name: \u0421\u0438\u0434\u043e\u0440\u043e\u0432]\" <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u043d\u0430\u0434\u043e \u044f\u0432\u043d\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0435\u0441\u043b\u0438 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u044f \u0431\u0443\u0434\u0443 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e(\u0430 \u044f \u044d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u044e) \u0442\u043e \u043c\u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0431\u043e\u0440 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0445\u043e\u0442\u044c \u044d\u0442\u043e \u0438 \u0434\u0451\u0448\u0435\u0432\u043e, \u043d\u043e \u044d\u0442\u043e \u043b\u0438\u0448\u043d\u044f\u044f \u0440\u0430\u0431\u043e\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0443\u0436\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u0430<strong> \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a \u043d\u0435\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 &#171;\u041e\u0411\u042b\u0427\u041d\u0423\u042e&#187; \u0444\u0443\u043d\u043a\u0446\u0438\u044e<\/strong>.<\/p>\n<pre><code class=\"lisp\">(define-m (change obj . data)   (parsed-change obj (keyargs-to-pairs data)))  (defmethods Person   (parsed-change  (parsed)      (awhen (assq :first-name parsed) (set! self.first-name (cdr it)))      (awhen (assq :last-name parsed)  (set! self.last-name  (cdr it)))      (awhen (assq :age parsed)  (set! self.age  (if (&lt; (cdr it) 0)      (let ((delta (+ self.age (cdr it))))        (if (&lt; delta 0) 0 delta))      (cdr it))))      self)   (:after parsed-change (parsed)      (prn \"work after all Person changes\\n\"))   )  <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u044b\u043d\u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0436\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e, \u043b\u0438\u0448\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<details class=\"spoiler\">\n<summary>\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define p1 (make-Person :age 31 :first-name \"\u0412\u0430\u0441\u044f\" :last-name \"\u041f\u0435\u0442\u0440\u043e\u0432\")) (to-s p1) ;;\"#Person[:age: 31, :first-name: \u0412\u0430\u0441\u044f, :last-name: \u041f\u0435\u0442\u0440\u043e\u0432]\"  (change p1 :age 28 :first-name \"\u041d\u0438\u043a\u0438\u0442\u0430\") ;;#(Person 28 \"\u041d\u0438\u043a\u0438\u0442\u0430\" \"\u041f\u0435\u0442\u0440\u043e\u0432\")#&lt;EOF&gt;<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c<strong> \u043a\u043b\u0430\u0441\u0441 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432<\/strong>, \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0438 \u0441 \u043d\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439.<\/p>\n<pre><code class=\"lisp\">(defclass Employee (Person)   (inn number snils))   (defmethods Employee   (parsed-change  (parsed)       (if (next-method-p) (call-next-method))       (awhen (assq :inn parsed) (if self.inn                     (error (join-to-str  \"Can't set INN: \" (cdr it) \"object has inn: \" self.inn))                     (set! self.inn (cdr it))))       (awhen (assq :number parsed)  (set! self.number  (cdr it)))       (awhen (assq :snils parsed)      (if self.snils      (error (join-to-str  \"Can't set SNILS: \" (cdr it) \"object has SNILS: \" self.snils))      (set! self.snils (cdr it))))       self)   (:after parsed-change (parsed)      (prn \"work after all Employee changes\\n\"))   )  <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0435. \u0422.\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u043e \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 <code>snils<\/code> \u0438 <code>inn<\/code>.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>parsed-change<\/code><\/p>\n<pre><code class=\"lisp\">(define-m (Employee! . args)   (let ((tmp (make-Employee-create)))     (make-Employee-initialize tmp :age 0) ;;\u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435 \u0438\u043d\u0430\u0447\u0435 \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c change     (apply change tmp args)     tmp)) <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>;\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u043c\u0435\u0442\u043e\u0434 change<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define emp1 (Employee! :first-name \"\u0421\u0430\u0448\u0430\" :last-name \"\u0421\u0438\u0434\u043e\u0440\u043e\u0432\" :age 32 :inn 1213223234 :snils 999999999999 :number 1)) (to-s emp1) ;;#Employee[:age: 32, :first-name: \u0421\u0430\u0448\u0430, :inn: 1213223234, :last-name: \u0421\u0438\u0434\u043e\u0440\u043e\u0432, :number: 1, :snils: 999999999999]\"  (change emp1 :first-name \"\u041a\u043e\u043b\u044f\" :inn 1000000) ;;-&gt;Error: Can't set INN: 1000000object has inn: 1213223234   (to-s emp1) ;;\"#Employee[:age: 32, :first-name: \u041a\u043e\u043b\u044f, :inn: 1213223234, :last-name: \u0421\u0438\u0434\u043e\u0440\u043e\u0432, :number: 1, :snils: 999999999999]\"<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0417\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043e\u0445\u0440\u0430\u043d\u044b \u043f\u043e\u043b\u0435\u0439 \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0430, \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u043d\u0435\u0439, \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0447\u0442\u043e-\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u0442. \u041d\u043e \u044d\u0442\u043e \u0438 \u043d\u0435 \u044f\u0432\u043b\u044f\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u043c \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f.<\/p>\n<p><strong>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a:<\/strong><\/p>\n<pre><code class=\"lisp\">(defclass Developer (Employee)   (level language))   (defmethods Developer   (parsed-change  (parsed)       (if (next-method-p) (call-next-method))       (awhen (assq :level parsed)     (set! self.level (cdr it)))       (awhen (assq :language parsed)  (set! self.language  (cdr it)))       self)   (:after parsed-change (parsed)      (prn \"work after all Developer changes\\n\"))   )   (define-m (Developer! . args)   (let ((tmp (make-Developer-create)))     (make-Developer-initialize tmp :age 0)     (apply change tmp args)     tmp))  <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define dev1 (Developer! :first-name \"\u0421\u0430\u0448\u0430\" :last-name \"\u041a\u043e\u0437\u043b\u043e\u0432\" :age 19 :level 'junior :language \"java\")) (to-s dev1) ;;\"#Developer[:age: 19, :first-name: \u0421\u0430\u0448\u0430, :inn: #f, :language: java, :last-name: \u041a\u043e\u0437\u043b\u043e\u0432, :level: junior, :number: #f, :snils: #f]\"<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c  <strong>\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f<\/strong> \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"lisp\">(defmethods Person   (greeting ()       (prn \"\u041f\u0440\u0438\u0432\u0435\u0442 \u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \" self.first-name \" \" self.last-name \", \u043c\u043e\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442: \" self.age \"\\n\"))   ) <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(for-list (el (list p1 emp1 dev1))     (greeting el))  ;; \u041f\u0440\u0438\u0432\u0435\u0442 \u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u041d\u0438\u043a\u0438\u0442\u0430 \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432, \u043c\u043e\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442: 28 ;; \u041f\u0440\u0438\u0432\u0435\u0442 \u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u041a\u043e\u043b\u044f \u0421\u0438\u0434\u043e\u0440\u043e\u0432, \u043c\u043e\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442: 32 ;; \u041f\u0440\u0438\u0432\u0435\u0442 \u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0421\u0430\u0448\u0430 \u041a\u043e\u0437\u043b\u043e\u0432, \u043c\u043e\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442: 19<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u042f\u0441\u043d\u043e, \u0447\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432.<\/p>\n<pre><code class=\"lisp\">(defmethods Employee   (greeting ()       (prn \"\u041f\u0440\u0438\u0432\u0435\u0442 \u044f \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u043a \" self.first-name \" \" self.last-name \", \u043c\u043e\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442: \" self.age \", \u0418\u041d\u041d: \" self.inn \"\\n\"))   )  (defmethods Developer   (greeting ()      (prn \"\u041f\u0440\u0438\u0432\u0435\u0442 \u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \" self.first-name \" \" self.last-name \", \u044f \u0437\u043d\u0430\u044e \" self.language \" \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \" self.level \"\\n\"))   ) <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(for-list (el (list p1 emp1 dev1))     (greeting el)) ;; \u041f\u0440\u0438\u0432\u0435\u0442 \u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u041d\u0438\u043a\u0438\u0442\u0430 \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432, \u043c\u043e\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442: 28 ;; \u041f\u0440\u0438\u0432\u0435\u0442 \u044f \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u043a \u041a\u043e\u043b\u044f \u0421\u0438\u0434\u043e\u0440\u043e\u0432, \u043c\u043e\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442: 32, \u0418\u041d\u041d: 1213223234 ;; \u041f\u0440\u0438\u0432\u0435\u0442 \u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0421\u0430\u0448\u0430 \u041a\u043e\u0437\u043b\u043e\u0432, \u044f \u0437\u043d\u0430\u044e java \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 junior<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c <strong>\u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c<\/strong>.<\/p>\n<pre><code class=\"lisp\">(defmethods Developer   (greeting (message)      (prn message \" \u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \" self.first-name \" \" self.last-name \", \u044f \u0437\u043d\u0430\u044e \"           self.language \" \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \" self.level \"\\n\"))   )  (greeting dev1 \"\u0414\u043e\u0431\u0440\u044b\u0439 \u0432\u0435\u0447\u0435\u0440:\") ;;\u0414\u043e\u0431\u0440\u044b\u0439 \u0432\u0435\u0447\u0435\u0440: \u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0421\u0430\u0448\u0430 \u041a\u043e\u0437\u043b\u043e\u0432, \u044f \u0437\u043d\u0430\u044e java \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 junior <\/code><\/pre>\n<p>\u0427\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c <strong>\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/strong> \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432:<\/p>\n<pre><code class=\"lisp\">(for-list (el (list p1 emp1 dev1))     (greeting el \"\u0414\u043e\u0431\u0440\u044b\u0439 \u0432\u0435\u0447\u0435\u0440:\")) ;;Error: Can't find applicable method: greeting, params:  (#(Person 28 \"\u041d\u0438\u043a\u0438\u0442\u0430\" \"\u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432\") \"\u0414\u043e\u0431\u0440\u044b\u0439 \u0432\u0435\u0447\u0435\u0440:\") \"\\n\" <\/code><\/pre>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0434\u0432\u0443\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>greeting<\/code>.<\/p>\n<pre><code class=\"lisp\">(defmethod (greeting p1 p2)   (prn \"\u041c\u0435\u0442\u043e\u0434 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \" p1 \" \u0438 \" p2 \"\\n\"))  (for-list (el (list p1 emp1 dev1))    (greeting el \"\u0414\u043e\u0431\u0440\u044b\u0439 \u0432\u0435\u0447\u0435\u0440:\")) ;; \u041c\u0435\u0442\u043e\u0434 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f #(Person 28 \u041d\u0438\u043a\u0438\u0442\u0430 \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432) \u0438 \u0414\u043e\u0431\u0440\u044b\u0439 \u0432\u0435\u0447\u0435\u0440: ;; \u041c\u0435\u0442\u043e\u0434 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f #(Employee 1 32 1213223234 999999999999 \u041a\u043e\u043b\u044f \u0421\u0438\u0434\u043e\u0440\u043e\u0432) \u0438 \u0414\u043e\u0431\u0440\u044b\u0439 \u0432\u0435\u0447\u0435\u0440: ;; \u0414\u043e\u0431\u0440\u044b\u0439 \u0432\u0435\u0447\u0435\u0440: \u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0421\u0430\u0448\u0430 \u041a\u043e\u0437\u043b\u043e\u0432, \u044f \u0437\u043d\u0430\u044e java \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 junior <\/code><\/pre>\n<p>\u042d\u0442\u043e \u0443\u0436\u0435 \u043b\u0443\u0447\u0448\u0435, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0451 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0442\u0430\u043a, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u0432\u044b\u0437\u043e\u0432 \u0441 \u043e\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439:<\/p>\n<pre><code class=\"lisp\">(defmethod (greeting p1 p2)   (greeting p1))  (for-list (el (list p1 emp1 dev1))   (greeting el \"\u0414\u043e\u0431\u0440\u044b\u0439 \u0432\u0435\u0447\u0435\u0440:\")) ;; \u041f\u0440\u0438\u0432\u0435\u0442 \u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u041d\u0438\u043a\u0438\u0442\u0430 \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432, \u043c\u043e\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442: 28 ;; \u041f\u0440\u0438\u0432\u0435\u0442 \u044f \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u043a \u041a\u043e\u043b\u044f \u0421\u0438\u0434\u043e\u0440\u043e\u0432, \u043c\u043e\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442: 32, \u0418\u041d\u041d: 1213223234 ;; \u0414\u043e\u0431\u0440\u044b\u0439 \u0432\u0435\u0447\u0435\u0440: \u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0421\u0430\u0448\u0430 \u041a\u043e\u0437\u043b\u043e\u0432, \u044f \u0437\u043d\u0430\u044e java \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 junior <\/code><\/pre>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/h2>\n<p>\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 <strong>\u0434\u043e\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/strong>\u0430, \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u043b\u044f\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 <strong>\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f<\/strong> \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f <strong>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043e\u043b\u044f\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/strong>, \u0431\u0435\u0437 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u043b\u044f\u043c &#8212; \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c<strong> \u0438\u0437\u044e\u043c\u0438\u043d\u043a\u0430 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/strong>. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0432 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e <strong>\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c<\/strong> <strong>\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/strong>. \u041d\u0443 \u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0434\u043e\u0442-\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e <strong>\u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430<\/strong>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/935292\/\"> https:\/\/habr.com\/ru\/articles\/935292\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><a href=\"https:\/\/gitflic.ru\/project\/nuinu\/gimp-script-fu-ext\" rel=\"noopener noreferrer nofollow\">\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043a Script-fu<\/a><\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <code>obj4.scm<\/code> \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0440\u0430\u043d\u0435\u0435, \u043c\u0435\u043d\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b\u0430. \u042f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0442\u0430\u043c \u0432\u0441\u0451 \u0447\u0442\u043e \u0445\u043e\u0442\u0435\u043b \u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b: <strong>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/strong> \u0438 <strong>\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/strong>,  <strong>\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435<\/strong>, <strong>\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430<\/strong>. \u041d\u043e \u0432\u043e\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u0437\u0451\u0440\u043d\u044b\u0448\u043a\u043e \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u044f, \u043c\u0435\u0448\u0430\u043b\u043e \u043c\u0435\u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442. \u0410 \u0432\u0441\u0451 \u043b\u0438 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043b\u044f <strong>\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b<\/strong> \u0441\u0438\u0441\u0442\u0435\u043c\u044b? \u0418 \u0434\u0435\u043b\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043b\u044e\u0434\u0438 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 GIMP\u0430 \u043e\u0431\u0440\u0435\u0437\u0430\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f Script-fu \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043d\u0435 \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0445\u0435\u0448-\u043a\u043e\u0434 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432(\u0430 \u0442\u043e \u0438 \u0432\u043e\u0432\u0441\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0438\u0448\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439). \u041d\u0435\u0442. \u0414\u043b\u044f \u0441\u0435\u0431\u044f \u044f \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e Script-fu \u0438 \u0431\u0443\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439 tinyscheme. \u041d\u043e <strong>\u0447\u0442\u043e<\/strong> \u0436\u0435 \u043c\u043e\u0436\u043d\u043e <strong>\u0441\u0434\u0435\u043b\u0430\u0442\u044c<\/strong> \u0435\u0449\u0451, <strong>\u0447\u0442\u043e\u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c<\/strong> \u0440\u0430\u0431\u043e\u0442\u044b <strong>\u041e\u041e \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/strong>?<\/p>\n<p>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u043e\u043b\u044f\u043c(\u0441\u043b\u043e\u0442\u0430\u043c) \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 <code>vfield<\/code>, \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044e, \u0442.\u043a., <strong>\u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043c\u0435\u0442\u043e\u0434\u0430<\/strong>(<em>\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0439<\/em> \u0438\u043b\u0438 \u043e\u0434\u0438\u043d <em>\u0438\u0437<\/em> \u0435\u0433\u043e<em> \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432<\/em>). \u0410 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u0442.\u043a <strong>\u043f\u043e\u043b\u044f \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/strong>(\u0438 \u044f \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0435 \u0441\u0442\u0440\u0435\u043c\u0438\u043b\u0441\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435, <strong>\u0442.\u043a \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435<\/strong> \u043f\u043e\u043b\u043e\u043c\u0430\u043b\u043e \u0431\u044b \u043b\u044e\u0431\u0443\u044e \u0441\u0445\u0435\u043c\u0443). \u0412 \u043f\u0438\u0442\u043e\u043d\u0435, \u0434\u0436\u0430\u0432\u0430\u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0441 \u044d\u0442\u0438\u043c \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0443 \u043d\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u0442\u043e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438 \u043d\u0438\u043a\u0443\u0434\u0430 \u043e\u0442 \u043d\u0438\u0445 \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0435\u0442\u044c\u0441\u044f, \u0430 \u0443 \u043d\u0430\u0441 \u0432\u0435\u043a\u0442\u043e\u0440!<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u044f \u043f\u043e\u043d\u044f\u043b \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0441\u0432\u043e\u0438\u0445 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0439! \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e \u0442\u0438\u043f\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432(\u043d\u0430 \u044d\u0442\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u044f \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435). \u0422.\u0435 \u044f <strong>\u0432\u0441\u0435\u0433\u0434\u0430 \u0447\u0451\u0442\u043a\u043e \u0437\u043d\u0430\u044e \u0441 \u043a\u0430\u043a\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0442\u0438\u043f\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d<\/strong> \u0442\u043e\u0442 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439<strong> \u043c\u0435\u0442\u043e\u0434<\/strong>, \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0410 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445<strong> \u041c\u041e\u0416\u041d\u041e<\/strong>(\u0438 \u0434\u0430\u0436\u0435 \u043d\u0443\u0436\u043d\u043e) <strong>\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 <\/strong>\u0444\u0443\u043d\u043a\u0446\u0438\u0438(\u0430 \u0432\u0435\u0440\u043d\u0435\u0435 \u0434\u0430\u0436\u0435 <strong>\u043c\u0430\u043a\u0440\u043e\u0441\u044b<\/strong>) <strong>\u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u043b\u044f\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/strong>. \u0410 \u044d\u0442\u043e \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u043f\u044b\u0442\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u043c\u0430\u043a\u0440\u043e\u0441 <code>with-slots<\/code>, \u043b\u0438\u0448\u044c \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438, \u0442.\u043a \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0440\u0435\u0434\u043a\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043f\u043e\u043b\u044e.<\/p>\n<p>\u041d\u043e \u043f\u043e\u043a\u0430 \u043d\u0430\u0448\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e\u0442\u043e\u043c\u043a\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u0410 \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u043e\u0433\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u043b\u044e \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c <strong>\u0428\u0410\u0411\u041b\u041e\u041d\u041d\u042b\u0419 \u043a\u043e\u0434<\/strong>, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434, \u0430 \u0448\u0430\u0431\u043b\u043e\u043d \u043a\u043e\u0434\u0430, \u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/strong>, \u043c\u044b \u044d\u0442\u0438 <strong>\u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432 \u043a\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432<\/strong>, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0441 <strong>\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/strong>. \u0417\u0434\u0435\u0441\u044c \u044f \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u043b \u0430\u043c\u0435\u0440\u0438\u043a\u0443. \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u044e\u0442 \u0432 \u0421++. \u0414\u0430 \u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u044e \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438, \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0443 \u043a\u043e\u0434\u0430 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0432\u0435\u0434\u044c \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<strong> \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0440\u0430\u043d\u0435\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432<\/strong> \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0417\u0430\u0442\u043e \u0441\u0430\u043c \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u0439(\u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430).<\/p>\n<p>\u043d\u0443 \u0430 <strong>\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/strong> \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0442\u043e\u0442 \u0436\u0435<strong> Dot \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/strong> \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0439 \u043c\u043d\u043e\u0439 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f.<\/h2>\n<p>\u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 <code>defgeneric<\/code> \u0438 <code>defmethod<\/code> \u041d\u0415 \u0418\u0417\u041c\u0415\u041d\u0418\u041b\u0418\u0421\u042c. \u0422\u0430\u043a \u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b\u0438 \u0438 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041f\u043e\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043e\u0434\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/p>\n<pre><code class=\"lisp\">(define (build-applicable-methods methods shablon)   (let* ((shablon-parents (build-shablon-parents shablon))  (acceptable-methods-primary (build-acceptable-method-list (qualifier-methods-primary methods) shablon-parents))  (acceptable-methods-before  (build-acceptable-method-list (qualifier-methods-before  methods) shablon-parents))  (acceptable-methods-after   (build-acceptable-method-list (qualifier-methods-after   methods) shablon-parents))  (acceptable-methods-around  (build-acceptable-method-list (qualifier-methods-around  methods) shablon-parents))  (compare-func (make-compare-shablon-call shablon-parents))  (rez (qualifier-methods! '() '() '() '())))     (qualifier-methods-around!  rez (build-concrete-methods-list-primary-by-shablon  (sort-c compare-func acceptable-methods-around) shablon))     (qualifier-methods-before!  rez (build-concrete-methods-list-by-shablon          (sort-c compare-func acceptable-methods-before) shablon))     (qualifier-methods-primary! rez (build-concrete-methods-list-primary-by-shablon  (sort-c compare-func acceptable-methods-primary) shablon))     (qualifier-methods-after!   rez (build-concrete-methods-list-by-shablon (reverse (sort-c compare-func acceptable-methods-after)) shablon))     rez)) <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>;\u043a\u0430\u043a\u043e\u0439 \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u0432 obj4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define (build-applicable-methods methods shablon)   (let* ((shablon-parents (build-shablon-parents shablon))  (acceptable-methods-primary (build-acceptable-method-list (qualifier-methods-primary methods) shablon-parents))  (acceptable-methods-before  (build-acceptable-method-list (qualifier-methods-before  methods) shablon-parents))  (acceptable-methods-after   (build-acceptable-method-list (qualifier-methods-after   methods) shablon-parents))  (acceptable-methods-around  (build-acceptable-method-list (qualifier-methods-around  methods) shablon-parents))  (compare-func (make-compare-shablon-call shablon-parents))  (rez (qualifier-methods! '() '() '() '())))     (qualifier-methods-around!  rez (sort-c compare-func acceptable-methods-around))     (qualifier-methods-before!  rez (sort-c compare-func acceptable-methods-before))     (qualifier-methods-primary! rez (sort-c compare-func acceptable-methods-primary))     (qualifier-methods-after!   rez (reverse (sort-c compare-func acceptable-methods-after)))     rez))<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422.\u0435 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u0443 \u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0432\u044b\u0437\u043e\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439: <code>build-concrete-methods-list-primary-by-shablon<\/code> \u0438 <code>build-concrete-methods-list-by-shablon<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0432 \u043a\u043e\u0434 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<pre><code class=\"lisp\">(define-m (build-concrete-methods-list-by-shablon methods shablon)   (map (lambda (m) (list (car m) (build-concrete-method-by-shablon (cadr m) shablon))) methods))  (define-m (build-concrete-methods-list-primary-by-shablon methods shablon)   (map (lambda (m) (list (car m) (build-concrete-method-primary-by-shablon (cadr m) shablon))) methods)) <\/code><\/pre>\n<p>\u0410 \u043e\u043d\u0438 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"lisp\">(define-m (build-concrete-method-by-shablon method shablon)   (let ((code      (get-closure-code method)))     (eval (our-macro-expand1 (list 'lambda (cadr code)                               (tree-expr-replace-vars-dot-fields (caddr code)                                                                  (make-var-stru-by-shablon (cadr code) shablon)))))))  ;;\u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434(\u0438 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u0439) \u0438\u043c\u0435\u0435\u0442 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0435\u0437\u0430\u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442!!! \u043e\u043d \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d! (define-m (build-concrete-method-primary-by-shablon method shablon)   (let ((code      (get-closure-code method)))     (eval (our-macro-expand1 (list 'lambda (cadr code)                               (tree-expr-replace-vars-dot-fields (caddr code)                                                                  (make-var-stru-by-shablon (cdr (cadr code)) shablon))))))) (define-m (make-var-stru-by-shablon args shablon)   (let ((rez '()))     (do ((cur-args    args    (cdr cur-args))          (cur-shablon shablon (cdr cur-shablon)))         ((or (null? cur-args) (null? cur-shablon))  (reverse rez))       (unless (eq? (car cur-shablon) :unspec)         (set! rez (cons (var-stru-def! (car cur-args) (car cur-shablon)) rez)))))) <\/code><\/pre>\n<p>\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u0434 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>make-var-stru-by-shablon<\/code> \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0443\u044e \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u0434\u043e\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 <code>with-stru<\/code>! \u041d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e: <code>tree-expr-replace-vars-dot-fields<\/code> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043c\u0435\u043d\u044b \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u0444\u0443\u043d\u043a\u0446\u0438\u044f tree-expr-replace-vars-dot-fields<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define-m (tree-expr-replace-vars-dot-fields expr var-list)    (let ((aliases     (make-hash 16))          (tree-expr-replace-get-set-rec #f)          (is-alias-fields #f)          (fd              #f) ;;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f          (in-var-list (lambda (var var-list) (find (lambda (x) (eq? ( var-stru-def-var x ) var)) var-list)))          (exclude-params (lambda (var-list params)                             (remove-if (lambda (var)                                           (cdr (find (lambda (elem) (eq? (var-stru-def-var var) elem)) params))) var-list))))       (set! is-alias-fields          (lambda (expr var-list)             (if (symbol? expr)                 (let ((rez (hash-ref aliases expr))) ;;\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0445\u0435\u0448.                    (if (car rez)                        (cdr rez) ;;\u0432\u0435\u0440\u043d\u0451\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043e\u043d \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f get \u0438 set                        (let ((var-field (split-dot-symbol expr))) ;;\u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \"\u0440\u0430\u0437\u0431\u0438\u0442\u044c\" \u0441\u0438\u043c\u0432\u043e\u043b.                           (if var-field                               (let ((in-var (in-var-list (car var-field)  var-list)))                                  (if (cdr in-var)                                      (let* ((getter-name  (make-symbol                                                            (var-stru-def-type (car in-var))                                                            \"-\" (cdr var-field)))                                             (setter-name  (make-symbol                                                            (var-stru-def-type (car in-var))                     <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-470041","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/470041","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=470041"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/470041\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=470041"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=470041"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=470041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}