{"id":469773,"date":"2025-08-06T15:01:20","date_gmt":"2025-08-06T15:01:20","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=469773"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=469773","title":{"rendered":"<span>GIMP Script-Fu \u041e\u041e\u041f. \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u043a\u043b\u0430\u0441\u0441\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>\u0418\u0442\u0430\u043a, \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u041e\u041e\u041f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 <strong>tinyscheme<\/strong>, \u0442\u0430\u043a \u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0443\u044e \u0432 <strong>script-fu<\/strong> GIMP. \u041d\u043e \u0433\u043b\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f \u043e\u0434\u043d\u0430 \u043c\u044b\u0441\u043b\u044c, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <strong>\u043f\u043e\u043b\u044f \u043e\u0431\u0449\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430<\/strong>. \u0412 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043e\u043d\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u043d\u043e \u0441\u043c\u044b\u0441\u043b \u043e\u0434\u0438\u043d, \u043d\u0435\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0449\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b, \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0445 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041e\u041e\u041f \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0438 <strong>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0445 \u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445<\/strong>. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u0442\u043e\u043d\u043a\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043d\u043e \u0438 \u0441 \u0438\u0445 <strong>\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430\u043c\u0438<\/strong>. \u0415\u0441\u043b\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0431\u0449\u0438\u0435 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0430\u043a\u043e\u0439 \u0442\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0442\u043e \u0441 \u044d\u0442\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c <strong>\u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e<\/strong> \u043e\u0431\u044a\u0435\u043a\u0442\u044b \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, \u043d\u043e \u0438 <strong>\u0438\u0445 \u043f\u043e\u0442\u043e\u043c\u043a\u0438<\/strong>. \u0418 \u043f\u043e \u0438\u0434\u0435\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u044b<strong> \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0442\u0438\u043f\u0430\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/strong>, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0438\u043f\u0430\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0410 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 <strong>\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u043e\u0434\u043d\u0438\u0445 \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445<\/strong>. \u0412\u043e \u0432\u0441\u044f\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a\u0430\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u0430 \u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u042f \u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u043b(\u0434\u0430 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u043b\u0433\u043e) \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 \u043f\u043e\u043b\u044f \u0432 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0440\u0435\u0448\u0438\u043b \u0447\u0442\u043e \u043d\u0435 \u043d\u0430\u0434\u043e \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0445 \u0432 \u043e\u0431\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u0447\u043b\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u0438\u0437 \u043e\u0431\u0449\u0435\u0439 \u043c\u0430\u0441\u0441\u044b. \u041d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <strong>\u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0441\u043f\u0438\u0441\u043e\u043a<\/strong> \u043f\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c <strong>\u043f\u043e\u043b\u044f \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u043b\u0430\u0441\u0441\u0430<\/strong>.<\/p>\n<pre><code class=\"lisp\">(defclass class-a (O1 O2)  ;;\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0435\u0434\u043a\u043e\u0432   (a b)               ;;\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0445(\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u0445)   (static-a           ;;\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u0449\u0438\u0445 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430.    (static-b '())))  ;; \u0410 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0438 \u0442\u0430\u043a \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u043e: (defclass class-a (O1 O2)  ;;\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0435\u0434\u043a\u043e\u0432   (a b    (static-a :class) (static-b '() :class))    ;;\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0445(\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u0445)   )  <\/code><\/pre>\n<p>\u041d\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043e\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439, \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u044d\u0442\u0438\u043c \u043f\u043e\u043b\u044f\u043c. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u0438\u043c \u043a\u0430\u043a \u043a \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043b\u0438 \u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u0438\u043c \u043a\u0430\u043a \u043a \u043f\u043e\u043b\u044f\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<pre><code class=\"lisp\">;;\u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043a \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430 (get-vield class :static-a)  ;;\u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043a \u043f\u043e\u043b\u044f\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430. (get-field obj1  :static-a)<\/code><\/pre>\n<p>\u0423 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e &#8212; \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043e\u0431\u044a\u0435\u043a\u0442 \u0447\u0442\u043e\u0431\u044b \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u043c \u043f\u043e\u043b\u0435\u043c, \u0437\u0430\u0442\u043e \u0443<strong> \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/strong> \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0438\u0433\u0440\u0430\u044e\u0449\u0435\u0435 <strong>\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/strong>. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043a\u0443\u044e \u0442\u043e \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043f\u043e\u043b\u044f\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0432 \u043d\u0435\u0451 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<pre><code class=\"lisp\">(defmethod (test-a (x class-a))   (prn \"static-a: \"  (get-field x :static-a) \"\\n\")) <\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 <strong>\u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <\/strong><code><strong>class-a<\/strong><\/code><strong> \u0438 \u0434\u043b\u044f \u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432<\/strong>, \u0430 \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0430\u0441\u0441, \u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u043f\u043e\u043b\u044e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0432\u0441\u0451 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0448\u043b\u043e \u0431\u044b \u043b\u0435\u0441\u043e\u043c. \u0418 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 <code>class-a<\/code> \u043e\u043d\u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c \u0431\u044b \u0437\u0430\u0447\u0435\u043c \u0442\u043e \u043a \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430 \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u043b\u0438\u0448\u044c \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435. \u0418 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 <strong>\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/strong> \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u043e\u0442 <strong>\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u044c\u044e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u043e\u0431\u0449\u0438\u0445 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430<\/strong>, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043f\u043e\u043b\u044f\u043c \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432 \u043a\u0430\u043a\u0438\u0445 \u0442\u043e \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u0432 \u043a\u0430\u043a\u0438\u0445 \u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u044f\u0445 \u043e\u0431\u0449\u0438\u0445 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430\u0434\u043e \u0433\u0434\u0435 \u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0441 \u043d\u0435\u0439, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u043b\u044f\u0445 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u043a\u043e\u0434 \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u0443 \u041e\u041e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define *class-fields-static*   (make-hash 32))  (define (save-class-static-fields class fields)   (hash-set! *class-fields-static* class fields))  (define (get-class-static-fields class)   (hash-ref *class-fields-static* class))  (define-m (get-class-static-fields-all class)   (find-class-fields-all class get-class-static-fields))  ;;\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430. (define *class-virtual-static-get*   (make-hash 128)) (define *class-virtual-static-set*   (make-hash 128))  (define (add-class-virtual-static-get  class key func)   (hash-set! *class-virtual-static-get* (list class key)  func))  (define (class-virtual-static-get . class-key)   (hash-ref *class-virtual-static-get* class-key))  (define (add-class-virtual-static-set  class key func)   ;;(prn \"add virt set func: \" func \"\\n\")   (hash-set! *class-virtual-static-set* (list class key)  func))  (define (class-virtual-static-set . class-key)   (hash-ref *class-virtual-static-set* class-key)) <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445(\u043f\u043e\u043b\u0435\u0439 \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u043b\u0430\u0441\u0441\u0430), \u0444\u0443\u043d\u043a\u0446\u0438\u044f  \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0430\u044f:<\/p>\n<pre><code class=\"lisp\">(define-m (find-class-fields-all class getter-class-fields)   (let ((rez (make-hash 6)) (classes   (cons class (get-class-parents-all class))))     (for-list (cur-class classes)       (let ((fields (getter-class-fields cur-class))) (if (and (car fields) (list? (cdr fields)))     (for-list (el (cdr fields))       (if (list? el)       (hash-set! rez (car el) el)       (hash-set! rez el el))       ))))     (map cdr (hash2pairs rez))))   (define-m (get-class-fields-all class)   (find-class-fields-all class get-class-fields))  (define-m (get-class-static-fields-all class)   (find-class-fields-all class get-class-static-fields)) <\/code><\/pre>\n<p>\u042d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043a\u043e\u0434, \u0440\u0430\u043d\u044c\u0448\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 &#171;\u043e\u0431\u043e\u0431\u0449\u0438\u043b\u0438&#187; \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u043b\u0438\u0431\u043e \u043f\u043e\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430, \u043b\u0438\u0431\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<p>\u0412 \u043c\u0430\u043a\u0440\u043e\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f(\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f) \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0430\u044f \u0441\u043f\u0438\u0441\u043a\u0438 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432, \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u043a\u043b\u0430\u0441\u0441\u0430(\u0442\u0430\u043a \u0436\u0435 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430).<\/p>\n<pre><code class=\"lisp\">;;\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u043b\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442,\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b (define-m (make-list-class-fields-ind lst-names start-ind)    (let ((new-lst '())          (cur-ind start-ind))      (for-list (cur lst-names)          (if (atom? cur)              (set! new-lst (cons (class-field! cur       cur-ind  #f         (sym2key cur))       new-lst))              (set! new-lst (cons (class-field! (car cur) cur-ind (cadr cur)  (sym2key (car cur))) new-lst)))          (set! cur-ind (+ cur-ind 1)))       (reverse new-lst)))  (define-m (make-list-class-fields lst-names)   (make-list-class-fields-ind lst-names 1))  (define-m (make-list-class-fields-static lst-names)   (make-list-class-fields-ind lst-names 0)) <\/code><\/pre>\n<p>\u0423 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 1 \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u0442.\u043a \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u0432\u043e\u0442 \u0443 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u043b\u044f \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0441 0 \u0438\u043d\u0434\u0435\u043a\u0441\u0430.<\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435 <strong>\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0430\u044f \u043e\u0431\u044a\u0435\u043a\u0442<\/strong>, \u044f<strong> \u0440\u0430\u0437\u043e\u0431\u044c\u044e<\/strong> \u0435\u0451 \u043d\u0430 <strong>\u0434\u0432\u0435 <\/strong>\u0444\u0443\u043d\u043a\u0446\u0438\u0438: <strong>\u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0443\u044e<\/strong> \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <strong>\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0443\u044e<\/strong> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0441 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define (make-maker name fields)    (let ((f-name name)          (l-stru (length fields))          (s (gensym)) ;;name local structure          (t-stru  (gensym)))          (let ((name-maker (string-&gt;symbol (string-append \"make-\" (symbol-&gt;string f-name))))                (name-creator (string-&gt;symbol (string-append \"make-\" (symbol-&gt;string f-name) \"-create\")))                (name-initialize (string-&gt;symbol (string-append \"make-\" (symbol-&gt;string f-name) \"-initialize\"))))      `(begin         (define-m (,name-creator)           (let ((,s (make-vector ,(+ 1 l-stru))))             (vector-set! ,s 0 ',f-name)))          (defun (,name-initialize ,s &amp;key       ,@(map (lambda (f) (if (class-field-val f)      (list (class-field-name f) (class-field-val f))      (class-field-name f)))      fields))           ;; \u0432 \u0446\u0438\u043a\u043b\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f, \u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u043c\u0430\u043a\u0440\u043e\u0441           ,@(let ((rez '())                   (cur     fields))               (while (not (null? cur))                 ;;(print cur)                 (set! rez (cons `(vector-set! ,s                                               ,(class-field-index (car cur))                                               ,(class-field-name  (car cur)))                                 rez))                 (set! cur (cdr cur)))               (reverse rez))           ,s)         (define-m (,name-maker . args)           (let ((,s (,name-creator)))             (apply ,name-initialize  (cons ,s args))))))))  <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c <strong>\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430<\/strong>, \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0433\u0435\u0442\u0442\u0435\u0440\u044b \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0433\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439, \u0433\u0435\u0442\u0442\u0435\u0440\u044b \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c<strong> \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u043d\u0435 \u043a\u0430\u043a \u043c\u0430\u043a\u0440\u043e\u0441\u044b<\/strong>. \u0418 \u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0434\u0430\u043b\u0435\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439(\u0430\u0446\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432).<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define-m (make-init-static-fields fields)   (let ((name (gensym)))     `(lambda (,name)        ,@(map (lambda (var) `(vector-set! ,name ,(class-field-index var)                                      ,(class-field-val   var))) fields))   ))  (define-m (make-static-getters name fields)    (let ((f-name name)          (l-stru (length fields))          (obj  (gensym))  (rez1 '())  (rez  '()))      (for-list (cur fields)        (let ((name-getters       (make-name-complex f-name  (string-append \"-\" (symbol-&gt;string  (class-field-name cur))))))  (push rez `(add-class-virtual-static-get ',f-name (class-field-key ,cur)   (lambda () (vector-ref ,f-name ,(class-field-index cur)))))  (push rez1 `(define ,name-getters #f))  (push rez  `(set! ,name-getters (lambda (,obj)   (vector-ref ,f-name ,(class-field-index cur)))))  ))      (cons rez1 rez)))   (define-m (make-static-setters name fields)   (let ((f-name name)         (l-stru (length fields))         (v (gensym))         (obj  (gensym)) (rez1 '()) (rez  '()))     (for-list (cur fields)       (let ((name-setters      (make-name-complex       f-name       (string-append \"-\"      (symbol-&gt;string       (class-field-name cur))      \"!\")))) (push rez `(add-class-virtual-static-set ',f-name (class-field-key ,cur)   (lambda (v) (vector-set! ,f-name ,(class-field-index cur) v)))) (push rez1 `(define ,name-setters #f)) (push rez  `(set! ,name-setters (lambda (,obj ,v)    (vector-set! ,f-name ,(class-field-index cur) ,v)))) ))     (cons rez1 rez))) <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0438\u0441\u0430\u0432 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0435 \u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u0435 <code>defclass<\/code> \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0438\u0445 \u0432 \u0442\u0435\u043b\u0435 \u0441\u0430\u043c\u043e\u0433\u043e <strong>\u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430:<\/strong><\/p>\n<pre><code class=\"lisp\">;; (define-macro (defclass . param)      (let ((name      (car  param))            (parents   (car (cdr  param)))             (fields    (car (cddr  param)))    (sfields  (if (not (null? (cdddr  param))) (car (cdddr param)) '()))) ;;\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430        (add-class-define  name parents)        (save-class-fields name fields)        (save-class-static-fields name sfields)        (let* ((parents-all (get-class-parents-all name))       (fields-all  (make-list-class-fields (get-class-fields-all  name))) ;;\u0441\u043d\u0430\u0431\u0434\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.       (fields-static-all  (make-list-class-fields-static (get-class-static-fields-all  name)))       (l-fstatic          (length fields-static-all))               (sfields-key-new (map (lambda (f) (if (pair? f)    (sym2key (car f))    (sym2key f)))    sfields))       (valid     (make-validator name))               (maker     (make-maker     name fields-all))               (getters   (make-getters   name fields-all))               (setters   (make-setters   name fields-all))               (sgetters  (make-static-getters   name fields-static-all))               (ssetters  (make-static-setters   name fields-static-all))       (init-class-static-field (make-init-static-fields fields-static-all)))  `(begin     ,@(make-def-keys sfields-key-new)        (set! *cache-class-precedence-list* #f)      ;;\u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u0435\u0448 cpl     ;; (define ,name  (make-vector ,l-fstatic))     ;; (,init-class-static-field ,name)     ;; ,valid ,@getters ,@setters ,@sgetters ,@ssetters ,maker)     ;;(prn \"sgetters: \" sgetters \"\\n\")     ,@(car sgetters) ,@(car ssetters)     (let ((,name  (make-vector ,l-fstatic)))       (,init-class-static-field ,name)       ,@(cdr sgetters) ,@(cdr ssetters))     ,valid ,@getters ,@setters ,maker)  ))) <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0438, \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u043e\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430, \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0438\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0440\u0430\u043d\u044c\u0448\u0435, \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0435\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0445 \u0433\u0435\u0442\u0442\u0435\u0440\u044b \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u044b \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041d\u043e \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0442\u0435\u043b\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u0430, \u0438 \u0432\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u0435 \u044d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u044f \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e \u044d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432, \u0430 \u0442\u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0448\u0435 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u0441\u0435 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0432\u0438\u0434\u043d\u044b, \u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, <strong>\u0441\u043a\u0440\u044b\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u0435<\/strong>.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u043b\u044f\u043c \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b, \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0439 \u0438\u043c\u0435\u043d\u0438 \u043a\u043b\u0430\u0441\u0441\u0430. \u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043d\u043e \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e <strong>\u044d\u0442\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u0440\u0447\u0430\u0442 \u0432\u0435\u0437\u0434\u0435 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438<\/strong>. \u0418 \u0438\u0445 \u043b\u0435\u0433\u043a\u043e \u043a\u0442\u043e \u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0442\u043e\u0433\u0434\u0430 \u0432\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u0442\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u0435(\u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432\u044b\u0448\u0435):<\/p>\n<pre><code class=\"lisp\">   (define ,name  (make-vector ,l-fstatic))    (,init-class-static-field ,name)    ,valid ,@getters ,@setters ,@sgetters ,@ssetters ,maker) <\/code><\/pre>\n<p>\u044f \u043f\u0435\u0440\u0435\u0448\u0451\u043b \u043a <strong>\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043d\u0451\u043c<\/strong>. \u0418 \u0432 \u044d\u0442\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e(\u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e) \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u043b\u044f\u043c \u044d\u0442\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0442\u0435\u0440\u044f\u043d(\u0441\u043a\u0440\u044b\u0442), \u041d\u041e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u0430\u0446\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432.<\/p>\n<pre><code class=\"lisp\">    ,@(car sgetters) ,@(car ssetters)          ;;\u043f\u0443\u0441\u0442\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u043c\u0451\u043d \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0430\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432     (let ((,name  (make-vector ,l-fstatic)))   ;;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u0442\u0430\u0442\u0438\u0447\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430       (,init-class-static-field ,name)         ;;\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.       ,@(cdr sgetters) ,@(cdr ssetters))       ;;\u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.     ,valid ,@getters ,@setters ,maker) <\/code><\/pre>\n<p>\u0442\u0430\u043a \u043c\u044b <strong>\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430<\/strong>, \u043e\u043d\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0433\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430, \u0442.\u043a. \u044d\u0442\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b. \u0410 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0444\u043e\u043a\u0443\u0441 \u0434\u043b\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0442.\u043a \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u0434, \u043d\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0441\u043a\u0440\u044b\u0442\u044b\u043c \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0435\u0449\u0451 \u043d\u0430\u0434\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0441 \u0433\u0435\u0442\u0442\u0435\u0440\u0430\u043c\u0438 \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u0430\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0435 \u0435\u0434\u0438\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u0435\u0442\u0442\u0435\u0440\u0430\u043c\u0438 \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u0430\u043c\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">;;\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u0446\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. (define (get-vfield-getter obj key)   (let ((t1 (class-virtual-get (type-obj obj) key)))     (if (car t1)     (cdr t1)     (let ((t1 (class-virtual-static-get (type-obj obj) key))) ;;\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430?         (if (car t1)             (cdr t1)             (lambda arg (prn \"Undefined get accessor gets args \" args \"\\n\")))))))  (define (get-vfield-setter obj key)   (let ((t1 (class-virtual-set (type-obj obj) key)))     (if (car t1)     (cdr t1)     (let ((t1 (class-virtual-static-set (type-obj obj) key))) ;;\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430?        (if (car t1)            (cdr t1)            (lambda arg (prn \"Undefined set accessor gets args \" args \"\\n\")))))))  ;;\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (define (sfield obj-or-class key)   (let ((v (class-virtual-static-get (if (symbol? obj-or-class)                                          obj-or-class                                          (type-obj obj-or-class)) key)))     (if (car v)     ((cdr v))     (begin         (prn \"can't find virtual get metod for object: \")          (prn  obj-or-class \", field \" key \"\\n\")))))  (define (sfield! obj-or-class key val)   (let ((v (class-virtual-static-set (if (symbol? obj-or-class)                                          obj-or-class                                          (type-obj obj-or-class)) key)))     (if (car v)     ((cdr v) val)     (begin        (prn \"can't find virtual set metod for object: \")        (prn  obj-or-class \", field \" key \"\\n\"))))) <\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0418 \u044d\u0442\u043e \u0412\u0421\u0415<\/strong> \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0434\u043b\u044f \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u044b\u043b\u0430 \u043d\u0435 \u0437\u0430\u0434\u0435\u0442\u0430. \u0424\u0443\u043d\u043a\u0446\u0438\u0438  <code>get-vfield-setter, get-vfield-getter<\/code> \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>with-slots<\/code> \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<details class=\"spoiler\">\n<summary>\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430.<\/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 \"obj4.scm\")) (load (string-append path-lib \"obj\/object.scm\")) (load (string-append path-lib \"tests.scm\"))  (load (string-append path-lib \"point.scm\")) (load (string-append path-lib \"tr2d.scm\")) (load (string-append path-lib \"vect.scm\")) <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 <strong>\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c<\/strong> \u043a\u0430\u043a\u0443\u044e \u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0443\u044e <strong>\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f<\/strong> \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u041f\u0443\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0438\u0433\u0443\u0440\u044b, \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u044d\u0442\u043e \u0446\u0432\u0435\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u043d\u0435\u043a\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0446\u0435\u043d\u0442\u0440\u0430, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0430\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u0438\u0433\u0443\u0440\u044b.<\/p>\n<pre><code class=\"lisp\">(defclass colored ()   (color)   (default-color))  (defclass centered (Object)   (p1)   (default-center))  (defclass line (centered colored)   (p2))  (defclass circle (centered colored)   (radius))  (defclass triangle (centered colored)   (p2 p3))  (defclass square (centered colored)   (gorizontal))  (defclass rectangle (square colored)   (vertical))  <\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0434\u0432\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0447\u0442\u043e \u0431\u044b \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<pre><code class=\"lisp\">(define-m (figure! . args)   (let ((name-creator    (string-&gt;symbol (join-to-str \"make-\" (car args) \"-create\")))         ;;(name-initialize (string-&gt;symbol (join-to-str \"make-\" (car args) \"-initialize\")));;\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 - \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d )     (let ((obj ((eval name-creator)))) ;;\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442       (initialize obj (cdr args))))) <\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0442\u0435\u043c \u0447\u0442\u043e \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <strong>initialize<\/strong> (\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438). \u041e\u043f\u0438\u0448\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432.:<\/p>\n<pre><code class=\"lisp\">(define-macro (awhen tform . body)   `(let ((it ,tform))      (when it ,@body)))  (defmethod (:before initialize (c colored) args)   (awhen (sfield c :default-color)  (vfield! c :color it)))  (defmethod (:before initialize (c centered) args)   (awhen (sfield c :default-center) (vfield! c :p1  it)))  ;;\u0440\u0430\u0437\u0431\u043e\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447.\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. (define-m (keyargs-to-pairs args)   (let ((rez '()))     (do ((cur args (cddr cur)))         ((or (null? cur) (null? (cdr cur))) (reverse rez))       (push rez (cons (car cur) (cadr cur))))))  (defmethod (initialize (c line) args)   (let ((ap (keyargs-to-pairs args)))     (awhen (assq :p1 ap)    (vfield! c :p1    (cdr it)))     (awhen (assq :p2 ap)    (vfield! c :p2    (cdr it)))     (awhen (assq :color ap) (vfield! c :color (cdr it))))   c) <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(defmethod (initialize (c circle) args)   (let ((ap (keyargs-to-pairs args)))     (awhen (assq :p1 ap)     (vfield! c :p1     (cdr it)))     (awhen (assq :radius ap) (vfield! c :radius (cdr it)))     (awhen (assq :color  ap) (vfield! c :color  (cdr it))))   c)  (defmethod (initialize (c triangle) args)   (let ((ap (keyargs-to-pairs args)))     (for-list (el '(:p3 :p2 :color :p1))       (awhen (assq el ap)  (vfield! c el (cdr it)))))   c)   (defmethod (initialize (c square) args)   (let ((ap (keyargs-to-pairs args)))     (for-list (el '(:gorizontal :color :p1))       (awhen (assq el ap)  (vfield! c el (cdr it)))))   c)   (defmethod (initialize (c rectangle) args)   (let ((ap (keyargs-to-pairs args)))     (for-list (el '(:gorizontal :vertical :color :p1))       (awhen (assq el ap)  (vfield! c el (cdr it)))))   c)<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440(\u043d\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430, \u044f \u043d\u0435 \u0441\u0442\u0430\u043b \u043f\u0438\u0441\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u044b <strong>call-next-method<\/strong>, \u0445\u043e\u0442\u044f \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e, \u043d\u043e \u0442\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0439), \u043e\u043d\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0434\u0430\u0436\u0435 \u043c\u0430\u043a\u0440\u043e\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0439 \u0442\u0430\u043a\u0438\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b, \u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 <code>:before<\/code>. \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0430\u043d\u0430\u0444\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 <code><strong>awhen<\/strong><\/code>, \u043c\u0430\u043a\u0440\u043e\u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0433\u043e\u0432\u043e\u0440\u0451\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0443 \u043d\u0430\u0441 \u044d\u0442\u043e <code><strong>it<\/strong><\/code>, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0438 \u043f\u0440\u0438 \u0431\u043b\u0430\u0433\u043e\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u043c \u0438\u0441\u0445\u043e\u0434\u0435 \u0442\u0430\u043a\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043a\u043d\u0438\u0433\u0435 <a href=\"https:\/\/github.com\/IisNuINu\/onlisp-rus\/blob\/master\/onlisp-ru.pdf\" rel=\"noopener noreferrer nofollow\">&#171;On Lisp&#187;<\/a> \u041f\u043e\u043b\u0430 \u0413\u0440\u0435\u043c\u0430(\u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u043c\u043e\u0451\u043c \u0433\u0438\u0442\u0445\u0430\u0431\u0435).<\/p>\n<details class=\"spoiler\">\n<summary>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(sfield! 'colored   :default-color  'red) (sfield! 'centered  :default-center (p! 0 0)) (sfield! 'circle    :default-center (p! 100 100)) (sfield! 'triangle   :default-color  'cian)  (define f1 (figure! 'line :p2 (p! 25 40))) (to-str f1) ;;f1\"#(line #(p 25 40) () ())  (sfield! 'line   :default-color  'red) (sfield! 'line   :default-center (p! 0 0))  (define f2 (figure! 'line :p2 (p! 25 40))) (to-str f2) ;;f2\"#(line #(p 25 40) red #(p 0 0))  (define f3 (figure! 'triangle :p2 (p! 25 40) :p3 (p! 75 180))) (to-str f3) ;;f3\"#(triangle #(p 75 180) #(p 25 40) cian ())  (sfield! 'triangle   :default-center (p! 0 0))  (define f3 (figure! 'triangle :p2 (p! 25 40) :p3 (p! 75 180))) (to-str f3) f3\"#(triangle #(p 75 180) #(p 25 40) cian #(p 0 0))<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0418\u043b\u0438 \u0432\u043e\u0442 \u0435\u0449\u0451 \u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<strong> \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430<\/strong>:<\/p>\n<pre><code class=\"lisp\">(defclass singltone (Object)   ()   ((instance #f)    (reinitialized #f)))  (define-m (singltone! . args)   (let ((name-creator    (string-&gt;symbol (join-to-str \"make-\" (car args) \"-create\")))         (name-initialize (string-&gt;symbol (join-to-str \"make-\" (car args) \"-initialize\"))))     (let ((obj (sfield (car args) :instance)))        (if obj            (when (sfield (car args) :reinitialized)               (initialize obj (cdr args)))            (let ((tmp ((eval name-creator))))               (sfield! (car args) :instance tmp)               (set! obj tmp)               (initialize obj (cdr args))))        obj))) <\/code><\/pre>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 <strong>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0449\u0451 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u0435\u0433\u043e \u0435\u0441\u043b\u0438 \u043e\u043d \u0443\u0436\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u0440\u0430\u0437 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f<\/strong>. \u041f\u0440\u0438\u043c\u0435\u0440 \u0443\u043a\u0440\u0430\u0448\u0435\u043d \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 \u0438\u043b\u0438 \u0435\u0451 \u0437\u0430\u043f\u0440\u0435\u0442\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(defclass fabrica1  (singltone)   (a b)   ())  (defclass fabrica2  (singltone)   (c (d 24))   ())   (defclass fabrica3  (fabrica2)   (e (f 42))   ())  (sfield! 'fabrica2  :reinitialized #t) (sfield! 'fabrica3  :reinitialized #t)  (defmethod (initialize (f fabrica1) args)   (let ((ap (keyargs-to-pairs args)))     (for-list (el '(:a :b))       (awhen (assq el ap)  (vfield! f el (cdr it)))))   f)  (defmethod (initialize (f fabrica2) args)   (if (next-method-p) (call-next-method))    (let ((ap (keyargs-to-pairs args)))     (for-list (el '(:c :d))       (awhen (assq el ap)  (vfield! f el (cdr it)))))   f)  (defmethod (initialize (f fabrica3) args)   (if (next-method-p)  (call-next-method))    (let ((ap (keyargs-to-pairs args)))     (for-list (el '(:e :f))       (awhen (assq el ap)  (vfield! f el (cdr it)))))   f) <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438 \u0433\u043e\u0432\u043e\u0440\u044f \u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0444\u0430\u0431\u0440\u0438\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 \u043d\u0451\u043c, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442  \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0438.<\/p>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?  \u041a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u0430, \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<pre><code class=\"lisp\">(define f11 (singltone! 'fabrica1 :a 1 :b 2))  (to-str f11) ;;\"#(fabrica1 2 1)\"  (define f12 (singltone! 'fabrica1 :a 11 :b 22))  (to-str f12)  ;;\"#(fabrica1 2 1)\" <\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0430, \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0432\u043e\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u043e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<pre><code class=\"lisp\">(define f21 (singltone! 'fabrica2 :c 1 :d 2))   (to-str f21) ;;\"#(fabrica2 2 1)\"  (define f22 (singltone! 'fabrica2 :c 3 :d 4))  (to-str f22) ;;\"#(fabrica2 4 3)\" (to-str f21) ;;\"#(fabrica2 4 3)\" <\/code><\/pre>\n<p>\u0438 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0430\u0431\u0440\u0438\u043a.<\/p>\n<pre><code class=\"lisp\">(define f31 (singltone! 'fabrica3 :c 1 :d 2 :e 3 :f 4))  (to-str f31) ;;\"#(fabrica3 3 2 1 4)\"  (define f32 (singltone! 'fabrica3  :d 12  :f 14))  (to-str f32) ;;\"#(fabrica3 3 12 1 14)\" (to-str f31) ;;\"#(fabrica3 3 12 1 14)\" <\/code><\/pre>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b.<\/h2>\n<p>\u042f \u0434\u0443\u043c\u0430\u044e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043a\u043e\u0434 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043c\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u041e\u041e\u041f \u0434\u043b\u044f script-fu \u043d\u0430 99%. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043d\u044f\u043b\u0430, \u0433\u0434\u0435-\u0442\u043e \u043e\u043a\u043e\u043b\u043e \u0434\u0432\u0443\u0445 \u0434\u043d\u0435\u0439 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430: \u0430 \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c, \u0438 \u0442\u0430\u043a \u043b\u0438 \u043d\u0443\u0436\u043d\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430? \u041d\u043e \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0446\u0435\u043d\u043d\u044b\u043c \u0438\u0437 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u044d\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0430 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0447\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430.<\/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\/934560\/\"> https:\/\/habr.com\/ru\/articles\/934560\/<\/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>\u0418\u0442\u0430\u043a, \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u041e\u041e\u041f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 <strong>tinyscheme<\/strong>, \u0442\u0430\u043a \u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0443\u044e \u0432 <strong>script-fu<\/strong> GIMP. \u041d\u043e \u0433\u043b\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f \u043e\u0434\u043d\u0430 \u043c\u044b\u0441\u043b\u044c, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <strong>\u043f\u043e\u043b\u044f \u043e\u0431\u0449\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430<\/strong>. \u0412 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043e\u043d\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u043d\u043e \u0441\u043c\u044b\u0441\u043b \u043e\u0434\u0438\u043d, \u043d\u0435\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0449\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b, \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0445 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041e\u041e\u041f \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0438 <strong>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0445 \u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445<\/strong>. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u0442\u043e\u043d\u043a\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043d\u043e \u0438 \u0441 \u0438\u0445 <strong>\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430\u043c\u0438<\/strong>. \u0415\u0441\u043b\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0431\u0449\u0438\u0435 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0430\u043a\u043e\u0439 \u0442\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0442\u043e \u0441 \u044d\u0442\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c <strong>\u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e<\/strong> \u043e\u0431\u044a\u0435\u043a\u0442\u044b \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, \u043d\u043e \u0438 <strong>\u0438\u0445 \u043f\u043e\u0442\u043e\u043c\u043a\u0438<\/strong>. \u0418 \u043f\u043e \u0438\u0434\u0435\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u044b<strong> \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0442\u0438\u043f\u0430\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/strong>, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0438\u043f\u0430\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0410 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 <strong>\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u043e\u0434\u043d\u0438\u0445 \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445<\/strong>. \u0412\u043e \u0432\u0441\u044f\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a\u0430\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u0430 \u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u042f \u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u043b(\u0434\u0430 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u043b\u0433\u043e) \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 \u043f\u043e\u043b\u044f \u0432 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0440\u0435\u0448\u0438\u043b \u0447\u0442\u043e \u043d\u0435 \u043d\u0430\u0434\u043e \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0445 \u0432 \u043e\u0431\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u0447\u043b\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u0438\u0437 \u043e\u0431\u0449\u0435\u0439 \u043c\u0430\u0441\u0441\u044b. \u041d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <strong>\u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0441\u043f\u0438\u0441\u043e\u043a<\/strong> \u043f\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c <strong>\u043f\u043e\u043b\u044f \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u043b\u0430\u0441\u0441\u0430<\/strong>.<\/p>\n<pre><code class=\"lisp\">(defclass class-a (O1 O2)  ;;\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0435\u0434\u043a\u043e\u0432   (a b)               ;;\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0445(\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u0445)   (static-a           ;;\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u0449\u0438\u0445 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430.    (static-b '())))  ;; \u0410 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0438 \u0442\u0430\u043a \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u043e: (defclass class-a (O1 O2)  ;;\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0435\u0434\u043a\u043e\u0432   (a b    (static-a :class) (static-b '() :class))    ;;\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0445(\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u0445)   )  <\/code><\/pre>\n<p>\u041d\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043e\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439, \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u044d\u0442\u0438\u043c \u043f\u043e\u043b\u044f\u043c. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u0438\u043c \u043a\u0430\u043a \u043a \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043b\u0438 \u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u0438\u043c \u043a\u0430\u043a \u043a \u043f\u043e\u043b\u044f\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<pre><code class=\"lisp\">;;\u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043a \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430 (get-vield class :static-a)  ;;\u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043a \u043f\u043e\u043b\u044f\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430. (get-field obj1  :static-a)<\/code><\/pre>\n<p>\u0423 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e &#8212; \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043e\u0431\u044a\u0435\u043a\u0442 \u0447\u0442\u043e\u0431\u044b \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u043c \u043f\u043e\u043b\u0435\u043c, \u0437\u0430\u0442\u043e \u0443<strong> \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/strong> \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0438\u0433\u0440\u0430\u044e\u0449\u0435\u0435 <strong>\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/strong>. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043a\u0443\u044e \u0442\u043e \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043f\u043e\u043b\u044f\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0432 \u043d\u0435\u0451 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<pre><code class=\"lisp\">(defmethod (test-a (x class-a))   (prn \"static-a: \"  (get-field x :static-a) \"\\n\")) <\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 <strong>\u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <\/strong><code><strong>class-a<\/strong><\/code><strong> \u0438 \u0434\u043b\u044f \u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432<\/strong>, \u0430 \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0430\u0441\u0441, \u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u043f\u043e\u043b\u044e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0432\u0441\u0451 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0448\u043b\u043e \u0431\u044b \u043b\u0435\u0441\u043e\u043c. \u0418 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 <code>class-a<\/code> \u043e\u043d\u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c \u0431\u044b \u0437\u0430\u0447\u0435\u043c \u0442\u043e \u043a \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430 \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u043b\u0438\u0448\u044c \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435. \u0418 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 <strong>\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/strong> \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u043e\u0442 <strong>\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u044c\u044e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u043e\u0431\u0449\u0438\u0445 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430<\/strong>, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043f\u043e\u043b\u044f\u043c \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432 \u043a\u0430\u043a\u0438\u0445 \u0442\u043e \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u0432 \u043a\u0430\u043a\u0438\u0445 \u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u044f\u0445 \u043e\u0431\u0449\u0438\u0445 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430\u0434\u043e \u0433\u0434\u0435 \u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0441 \u043d\u0435\u0439, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u043b\u044f\u0445 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u043a\u043e\u0434 \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u0443 \u041e\u041e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define *class-fields-static*   (make-hash 32))  (define (save-class-static-fields class fields)   (hash-set! *class-fields-static* class fields))  (define (get-class-static-fields class)   (hash-ref *class-fields-static* class))  (define-m (get-class-static-fields-all class)   (find-class-fields-all class get-class-static-fields))  ;;\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430. (define *class-virtual-static-get*   (make-hash 128)) (define *class-virtual-static-set*   (make-hash 128))  (define (add-class-virtual-static-get  class key func)   (hash-set! *class-virtual-static-get* (list class key)  func))  (define (class-virtual-static-get . class-key)   (hash-ref *class-virtual-static-get* class-key))  (define (add-class-virtual-static-set  class key func)   ;;(prn \"add virt set func: \" func \"\\n\")   (hash-set! *class-virtual-static-set* (list class key)  func))  (define (class-virtual-static-set . class-key)   (hash-ref *class-virtual-static-set* class-key)) <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445(\u043f\u043e\u043b\u0435\u0439 \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u043b\u0430\u0441\u0441\u0430), \u0444\u0443\u043d\u043a\u0446\u0438\u044f  \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0430\u044f:<\/p>\n<pre><code class=\"lisp\">(define-m (find-class-fields-all class getter-class-fields)   (let ((rez (make-hash 6)) (classes   (cons class (get-class-parents-all class))))     (for-list (cur-class classes)       (let ((fields (getter-class-fields cur-class))) (if (and (car fields) (list? (cdr fields)))     (for-list (el (cdr fields))       (if (list? el)       (hash-set! rez (car el) el)       (hash-set! rez el el))       ))))     (map cdr (hash2pairs rez))))   (define-m (get-class-fields-all class)   (find-class-fields-all class get-class-fields))  (define-m (get-class-static-fields-all class)   (find-class-fields-all class get-class-static-fields)) <\/code><\/pre>\n<p>\u042d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043a\u043e\u0434, \u0440\u0430\u043d\u044c\u0448\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 &#171;\u043e\u0431\u043e\u0431\u0449\u0438\u043b\u0438&#187; \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u043b\u0438\u0431\u043e \u043f\u043e\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430, \u043b\u0438\u0431\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<p>\u0412 \u043c\u0430\u043a\u0440\u043e\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f(\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f) \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0430\u044f \u0441\u043f\u0438\u0441\u043a\u0438 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432, \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u043a\u043b\u0430\u0441\u0441\u0430(\u0442\u0430\u043a \u0436\u0435 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430).<\/p>\n<pre><code class=\"lisp\">;;\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u043b\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442,\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b (define-m (make-list-class-fields-ind lst-names start-ind)    (let ((new-lst '())          (cur-ind start-ind))      (for-list (cur lst-names)          (if (atom? cur)              (set! new-lst (cons (class-field! cur       cur-ind  #f         (sym2key cur))       new-lst))              (set! new-lst (cons (class-field! (car cur) cur-ind (cadr cur)  (sym2key (car cur))) new-lst)))          (set! cur-ind (+ cur-ind 1)))       (reverse new-lst)))  (define-m (make-list-class-fields lst-names)   (make-list-class-fields-ind lst-names 1))  (define-m (make-list-class-fields-static lst-names)   (make-list-class-fields-ind lst-names 0)) <\/code><\/pre>\n<p>\u0423 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 1 \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u0442.\u043a \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u0432\u043e\u0442 \u0443 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u043b\u044f \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0441 0 \u0438\u043d\u0434\u0435\u043a\u0441\u0430.<\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435 <strong>\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0430\u044f \u043e\u0431\u044a\u0435\u043a\u0442<\/strong>, \u044f<strong> \u0440\u0430\u0437\u043e\u0431\u044c\u044e<\/strong> \u0435\u0451 \u043d\u0430 <strong>\u0434\u0432\u0435 <\/strong>\u0444\u0443\u043d\u043a\u0446\u0438\u0438: <strong>\u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0443\u044e<\/strong> \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <strong>\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0443\u044e<\/strong> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0441 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define (make-maker name fields)    (let ((f-name name)          (l-stru (length fields))          (s (gensym)) ;;name local structure          (t-stru  (gensym)))          (let ((name-maker (string-&gt;symbol (string-append \"make-\" (symbol-&gt;string f-name))))                (name-creator (string-&gt;symbol (string-append \"make-\" (symbol-&gt;string f-name) \"-create\")))                (name-initialize (string-&gt;symbol (string-append \"make-\" (symbol-&gt;string f-name) \"-initialize\"))))      `(begin         (define-m (,name-creator)           (let ((,s (make-vector ,(+ 1 l-stru))))             (vector-set! ,s 0 ',f-name)))          (defun (,name-initialize ,s &amp;key       ,@(map (lambda (f) (if (class-field-val f)      (list (class-field-name f) (class-field-val f))      (class-field-name f)))      fields))           ;; \u0432 \u0446\u0438\u043a\u043b\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f, \u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u043c\u0430\u043a\u0440\u043e\u0441           ,@(let ((rez '())                   (cur     fields))               (while (not (null? cur))                 ;;(print cur)                 (set! rez (cons `(vector-set! ,s                                               ,(class-field-index (car cur))                                               ,(class-field-name  (car cur)))                                 rez))                 (set! cur (cdr cur)))               (reverse rez))           ,s)         (define-m (,name-maker . args)           (let ((,s (,name-creator)))             (apply ,name-initialize  (cons ,s args))))))))  <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c <strong>\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430<\/strong>, \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0433\u0435\u0442\u0442\u0435\u0440\u044b \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0433\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439, \u0433\u0435\u0442\u0442\u0435\u0440\u044b \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c<strong> \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u043d\u0435 \u043a\u0430\u043a \u043c\u0430\u043a\u0440\u043e\u0441\u044b<\/strong>. \u0418 \u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0434\u0430\u043b\u0435\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439(\u0430\u0446\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432).<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"lisp\">(define-m (make-init-static-fields fields)   (let ((name (gensym)))     `(lambda (,name)        ,@(map (lambda (var) `(vector-set! ,name ,(class-field-index var)                                      ,(class-field-val   var))) fields))   ))  (define-m (make-static-getters name fields)    (let ((f-name name)          (l-stru (length fields))          (obj  (gensym))  (rez1 '())  (rez  '()))      (for-list (cur fields)        (let ((name-getters       (make-name-complex f-name  (string-append \"-\" (symbol-&gt;string  (class-field-name cur))))))  (push rez `(add-class-virtual-static-get ',f-name (class-field-key ,cur)   (lambda () (vector-ref ,f-name ,(class-field-index cur)))))  (push rez1 `(define ,name-getters #f))  (push rez  `(set! ,name-getters (lambda (,obj)   (vector-ref ,f-name ,(class-field-index cur)))))  ))      (cons rez1 rez)))   (define-m (make-static-setters name fields)   (let ((f-name name)         (l-stru (length fields))         (v (gensym))         (obj  (gensym)) (rez1 '()) (rez  '()))   <\/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-469773","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/469773","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=469773"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/469773\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=469773"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=469773"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=469773"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}