Racket (язык программирования)

Поделись знанием:
Перейти к: навигация, поиск
Racket
Класс языка:

мультипарадигмальный:
объектно-ориентированный, процедурный,
рефлективный,
функциональный,
логический,
мета

Появился в:

1994

Автор:

PLT Inc.

Выпуск:

6.7 (26 октября 2016)

Система типов:

динамическая, строгая, статическая

Диалекты:

[docs.racket-lang.org/ts-guide/ Typed Racket], [docs.racket-lang.org/lazy/ Lazy Racket], [docs.racket-lang.org/scribble/ Scribble], [docs.racket-lang.org/frtime/ FrTime] и т. д.

Испытал влияние:

Scheme, Eiffel[1]

Повлиял на:

Scheme[2]

Лицензия:

LGPL

Сайт:

[racket-lang.org/ lang.org]

Платформа:

кроссплатформенный

Racket (англ. racket — рэкет, ранее — PLTScheme) — мультипарадигменный язык программирования общего назначения, принадлежащий семейству Lisp/Scheme. Одно из предназначений racket — создание, разработка и реализация языков программирования[3][4]. Язык используется в различных контекстах: как скриптовый язык, как язык общего назначения, в обучении информатике, в научных исследованиях.

Платформа предоставляет пользователю реализацию языка Racket, включая развитую среду выполнения (англ. run time system)[5], различные библиотеки, JIT-компилятор и т. д., а также среду разработки DrRacket (ранее известную, как DrScheme) написанную на Racket[6]. Эта программная среда используется в учебном курсе ProgramByDesign[en] массачусетского технологического института[7][8]. Основной язык Racket отличает мощная макросистема, позволяющая создавать встраиваемые и предметно-ориентированные языки программирования, языковые конструкции (к примеру классы и модули) и диалекты Racket с различной семантикой[9][10][11][12].

Система является свободным и открытым ПО, распространяемым на условиях LGPL. Расширения и пакеты, написанные сообществом, доступны на PLaneT[13], веб-дистрибутиве системы[14].





История

Создание

Matthias Felleisen[en] основал компанию PLT Inc. в середине 1990-х, первоначально - как исследовательскую группу, а вскоре - проект по производству педагогических материалов для начинающих программистов (лекции, упражнения/проекты, программное обеспечение). В январе 1995 было решено разработать учебную среду программирования на языке Scheme. Matthew Flatt[en] собрал MrEd, оригинальную виртуальную машину Racket, используя libscheme, wxWidgets и некоторые другие свободные системы[15]. В течение последующих лет команда, в которую входили, в частности, Flatt, Robert Bruce Findler[en], Shriram Krishnamurthi[en], Cormac Flanagan, и многие другие выпускали среду DrScheme предназначенную для начинающих программистов-схемеров и исследований в области мягкой типизации (комбинации статической и динамической типизации)[6]. Основной язык программирования, поддерживаемый средой назывался PLT Scheme.

Параллельно с этим, команда начала проведение семинаров для учителей средней школы, обучая их разработке программ и функциональному программированию. Полевые испытания с этими учителями и их учениками определил основные направления развития продукта.

DrScheme был дополнен учебными языками, пошаговый алгебраический вычислитель (англ. algebraic stepper)[16], прозрачный REPL-цикл, подсистему печати на основе конструкторов (cons) и множество других нововведений, которые сделали DrScheme качественным образовательным продуктом. В 2001 году разработчиками языка была написан и опубликован учебник How to Design Programs[en], основанный на их философии обучения программированию.

Развитие DrScheme

В первое поколение версий DrScheme были введены средства для программирования в большом[en] c использованием модулей и классов. В версии 42 были добавлены юниты: система модулей — объектов первого класса, позволяющая дополнять модули в процессе разработки больших систем[17]. Система классов была с одной стороны дополнена (в частности интерфейсами в стиле Java), а с другой — сокращена (в частности было удалено множественное наследование)[10]. Язык развивался на протяжении ряда последовательных версий и набрал популярность к версии 53, что ещё ускорило работу над ним и следующая версия 100, стала эквивалентом «1.0».

В следующую крупную ревизию, получившую номер 200, была введена новая модульная система по умолчанию, интегрированная с макросами[17]. В частности, модульная система гарантирует, что вычисления время выполнения и вычисления времени компиляции разделены для поддержки «башни языков»[18]. В отличие от юнитов, эти модули не являются объектами первого класса.

В версию 300 введена поддержка Unicode, библиотека интерфейса с внешними функциями[en] и изменена система классов[17]. Позднее для релизов версии 300 была улучшена производительность путём добавления JIT-компилятора и сборки мусора с поддержкой поколений объектов.

К следующему мажорному релизу DrScheme перешёл на общепринятую систему нумерации версий на основе десятичных дробей. В версию 4.0 введено сокращение #lang для указания [под]языка, на котором написан модуль. Также в этот релиз введены неизменяемые пары и списки, поддержка мелкозернистого параллелизма, и статически типизированный диалект[19].

Racket

7 июня 2010 года, PLT Scheme был переименован в Racket[20], что совпало с выпуском версии 5.0. Впоследствии, в версии 5.1, базовая программа GUI была переписана с C++ на Racket c помощью собственного инструментария пользовательского интерфейса на всех платформах[15]. В версии 5.2 включен инструмент фоновой проверки синтаксиса, новую библиотеку-плоттер, библиотеки баз данных, и новый расширенный REPL[21]. В версию 5.3 включена новая функциональность: подмодули для опционально загружаемых модулей[22] , новые инструменты оптимизации, библиотеку JSON, и другие возможности[23]. В версии 5.3.1 значительно улучшен DrRacket: добавлен новый инструмент просмотра документации, проверка синтаксиса в фоне включена по умолчанию[24].

Примеры кода

Тривиальная программа "hello world" будет выглядеть следующим образом:

#lang racket
"Hello, World!"

При её запуске будет выведено:

"Hello, World!"

Вот чуть менее тривиальная программа:

#lang racket
(require 2htdp/image)
(let sierpinski ([n 8])
  (if (zero? n)
    (triangle 2 'solid 'red)
    (let ([t (sierpinski (- n 1))])
      (freeze (above t (beside t t))))))

Данная программа, взятая с сайта Racket, нарисует треугольник Серпинского, с глубиной вложенности 8.

Используя директиву #lang, можно писать программы на альтернативных диалектах Racket'a. Вот пример факториала на Typed Racket, диалекте со статической типизацией:

#lang typed/racket
(: fact (Integer -> Integer))
(define (fact n)
  (cond [(zero? n) 1]
        [else (* n (fact (- n 1)))]))

Напишите отзыв о статье "Racket (язык программирования)"

Примечания

  1. [www.ccs.neu.edu/racket/pubs/dls10-sf.pdf DLS 2010: Contracts for First-Class Classes] (2010). [www.webcitation.org/6GpxBuN6l Архивировано из первоисточника 23 мая 2013].
  2. [www.r6rs.org Revised6 Report on the Algorithmic Language Scheme (R6RS)]. Scheme Steering Committee (August 2007). Проверено 13 сентября 2011. [www.webcitation.org/6GpxBG9Iq Архивировано из первоисточника 23 мая 2013].
  3. [docs.racket-lang.org/guide/intro.html Welcome to Racket]. Проверено 15 августа 2011. [www.webcitation.org/6GpxCUspP Архивировано из первоисточника 23 мая 2013].
  4. [docs.racket-lang.org/guide/dialects.html Dialects of Racket and Scheme]. Проверено 15 августа 2011. [www.webcitation.org/6GpxDDkhP Архивировано из первоисточника 23 мая 2013].
  5. (1999) "{{{title}}}". Programming Languages as Operating Systems (or, Revenge of the Son of the Lisp Machine). 
  6. 1 2 (2001) «[www.ccs.neu.edu/racket/pubs/jfp01-fcffksf.pdf DrScheme: A Programming Environment for Scheme]». Journal of Functional Programming.
  7. [www.ccs.neu.edu/scheme/pubs/#cse2003-fffk The TeachScheme! Project: Computing and Programming for Every Student].
  8. [programbydesign.org/overview Overview]. Program by Design. Проверено 17 августа 2011. [www.webcitation.org/6GpxDsIGb Архивировано из первоисточника 23 мая 2013].
  9. [blog.racket-lang.org/2007/05/macros-matter.html Macros Matter] (3 мая 2007). Проверено 8 августа 2011. [www.webcitation.org/6GpxEQe5a Архивировано из первоисточника 23 мая 2013].
  10. 1 2 (2006) "[www.ccs.neu.edu/scheme/pubs/asplas06-fff.pdf Scheme with Classes, Mixins, and Traits]". Asian Symposium on Programming Languages and Systems. 
  11. (1998) "[www.ccs.neu.edu/scheme/pubs/pldi98-ff.ps.gz Units: Cool Modules for Hot Languages]". Programming Language Design and Implementation. 
  12. (2011) "[www.ccs.neu.edu/scheme/pubs/pldi11-thacff.pdf Languages as Libraries]". Programming Language Design and Implementation. 
  13. [planet.racket-lang.org/ PLaneT]
  14. Matthews, J. (2006). "Component Deployment with PLaneT: You Want it Where?". Scheme and Functional Programming Workshop. 
  15. 1 2 [blog.racket-lang.org/2010/12/racket-version-5.html Rebuilding Racket's Graphics Layer] (8 декабря 2010). Проверено 23 августа 2011. [www.webcitation.org/6GpxF6OGj Архивировано из первоисточника 23 мая 2013].
  16. (2001) "[www.ccs.neu.edu/scheme/pubs/esop2001-cff.pdf Modeling an Algebraic Stepper]". European Symposium on Programming Languages. 
  17. 1 2 3 [docs.racket-lang.org/release-notes/racket/HISTORY.txt "Racket Core Release Notes"]. Проверено 15 апреля 2012. [www.webcitation.org/6GpxFjzKz Архивировано из первоисточника 23 мая 2013].
  18. Flatt, M. (2002). "Composable and Compilable Macros". International Conference on Functional Programming. 
  19. [blog.racket-lang.org/2008/06/plt-scheme-version-4.html PLT Scheme version 4.0] (12 июня 2008). Проверено 7 августа 2012. [www.webcitation.org/6GpxGJOg8 Архивировано из первоисточника 23 мая 2013].
  20. [racket-lang.org/new-name.html From PLT Scheme to Racket]. Racket-lang.org. Проверено 17 августа 2011. [www.webcitation.org/6GpxH5SvA Архивировано из первоисточника 23 мая 2013].
  21. [blog.racket-lang.org/2011/11/racket-v52.html Racket 5.2] (9 ноября 2011). Проверено 16 июня 2012. [www.webcitation.org/6GpxHftxZ Архивировано из первоисточника 23 мая 2013].
  22. [blog.racket-lang.org/2012/06/submodules.html Submodules] (3 июня 2012). Проверено 7 августа 2012. [www.webcitation.org/6GpxIGjy1 Архивировано из первоисточника 23 мая 2013].
  23. [blog.racket-lang.org/2012/08/racket-v53.html Racket 5.3] (7 августа 2012). Проверено 7 августа 2012. [www.webcitation.org/6GpxItSQR Архивировано из первоисточника 23 мая 2013].
  24. [blog.racket-lang.org/2012/11/racket-v531.html Racket 5.3.1] (7 ноября 2012). Проверено 7 ноября 2012. [www.webcitation.org/6GpxJVmyc Архивировано из первоисточника 23 мая 2013].

Литература

  • Matthias Felleisen, Conrad Barski M.D., David Van Horn, Eight Students of Northeastern University. Realm of Racket: Learn to Program, One Game at a Time!. — no starch press, June 2013. — 312 p. — ISBN 978-1-59327-491-7.

Уроки

  • [docs.racket-lang.org/quick/ Quick: An Introduction to Racket with Pictures]
  • [hashcollision.org/brainfudge/ F*dging up a Racket]—shows how to write a Brainfuck dialect for Racket
  • [jarnaldich.me/2011/08/07/raw-strings-in-racket.html Raw strings in Racket]—a reader extension for raw strings

Руководство по стилю

  • [www.ccs.neu.edu/home/matthias/Style/style/ How to Program Racket] (work in Progress as of 2011-09-25)

Ссылки

  • [racket-lang.org lang.org] — официальный сайт Racket
  • [blog.racket-lang.org/ Blog]
  • [git.racket-lang.org/plt/ Code Repository]
  • [planet.racket-lang.org/ PLaneT]
  • [docs.racket-lang.org/guide/ The Racket Guide]
  • [docs.racket-lang.org/reference/ The Racket Reference]
  • [docs.racket-lang.org/ All Racket Documentation]

Отрывок, характеризующий Racket (язык программирования)

– Пропадал, – отвечал Шиншин. – На Кавказе был, а там бежал, и, говорят, у какого то владетельного князя был министром в Персии, убил там брата шахова: ну с ума все и сходят московские барыни! Dolochoff le Persan, [Персианин Долохов,] да и кончено. У нас теперь нет слова без Долохова: им клянутся, на него зовут как на стерлядь, – говорил Шиншин. – Долохов, да Курагин Анатоль – всех у нас барынь с ума свели.
В соседний бенуар вошла высокая, красивая дама с огромной косой и очень оголенными, белыми, полными плечами и шеей, на которой была двойная нитка больших жемчугов, и долго усаживалась, шумя своим толстым шелковым платьем.
Наташа невольно вглядывалась в эту шею, плечи, жемчуги, прическу и любовалась красотой плеч и жемчугов. В то время как Наташа уже второй раз вглядывалась в нее, дама оглянулась и, встретившись глазами с графом Ильей Андреичем, кивнула ему головой и улыбнулась. Это была графиня Безухова, жена Пьера. Илья Андреич, знавший всех на свете, перегнувшись, заговорил с ней.
– Давно пожаловали, графиня? – заговорил он. – Приду, приду, ручку поцелую. А я вот приехал по делам и девочек своих с собой привез. Бесподобно, говорят, Семенова играет, – говорил Илья Андреич. – Граф Петр Кириллович нас никогда не забывал. Он здесь?
– Да, он хотел зайти, – сказала Элен и внимательно посмотрела на Наташу.
Граф Илья Андреич опять сел на свое место.
– Ведь хороша? – шопотом сказал он Наташе.
– Чудо! – сказала Наташа, – вот влюбиться можно! В это время зазвучали последние аккорды увертюры и застучала палочка капельмейстера. В партере прошли на места запоздавшие мужчины и поднялась занавесь.
Как только поднялась занавесь, в ложах и партере всё замолкло, и все мужчины, старые и молодые, в мундирах и фраках, все женщины в драгоценных каменьях на голом теле, с жадным любопытством устремили всё внимание на сцену. Наташа тоже стала смотреть.


На сцене были ровные доски по средине, с боков стояли крашеные картины, изображавшие деревья, позади было протянуто полотно на досках. В середине сцены сидели девицы в красных корсажах и белых юбках. Одна, очень толстая, в шелковом белом платье, сидела особо на низкой скамеечке, к которой был приклеен сзади зеленый картон. Все они пели что то. Когда они кончили свою песню, девица в белом подошла к будочке суфлера, и к ней подошел мужчина в шелковых, в обтяжку, панталонах на толстых ногах, с пером и кинжалом и стал петь и разводить руками.
Мужчина в обтянутых панталонах пропел один, потом пропела она. Потом оба замолкли, заиграла музыка, и мужчина стал перебирать пальцами руку девицы в белом платье, очевидно выжидая опять такта, чтобы начать свою партию вместе с нею. Они пропели вдвоем, и все в театре стали хлопать и кричать, а мужчина и женщина на сцене, которые изображали влюбленных, стали, улыбаясь и разводя руками, кланяться.
После деревни и в том серьезном настроении, в котором находилась Наташа, всё это было дико и удивительно ей. Она не могла следить за ходом оперы, не могла даже слышать музыку: она видела только крашеные картоны и странно наряженных мужчин и женщин, при ярком свете странно двигавшихся, говоривших и певших; она знала, что всё это должно было представлять, но всё это было так вычурно фальшиво и ненатурально, что ей становилось то совестно за актеров, то смешно на них. Она оглядывалась вокруг себя, на лица зрителей, отыскивая в них то же чувство насмешки и недоумения, которое было в ней; но все лица были внимательны к тому, что происходило на сцене и выражали притворное, как казалось Наташе, восхищение. «Должно быть это так надобно!» думала Наташа. Она попеременно оглядывалась то на эти ряды припомаженных голов в партере, то на оголенных женщин в ложах, в особенности на свою соседку Элен, которая, совершенно раздетая, с тихой и спокойной улыбкой, не спуская глаз, смотрела на сцену, ощущая яркий свет, разлитый по всей зале и теплый, толпою согретый воздух. Наташа мало по малу начинала приходить в давно не испытанное ею состояние опьянения. Она не помнила, что она и где она и что перед ней делается. Она смотрела и думала, и самые странные мысли неожиданно, без связи, мелькали в ее голове. То ей приходила мысль вскочить на рампу и пропеть ту арию, которую пела актриса, то ей хотелось зацепить веером недалеко от нее сидевшего старичка, то перегнуться к Элен и защекотать ее.
В одну из минут, когда на сцене всё затихло, ожидая начала арии, скрипнула входная дверь партера, на той стороне где была ложа Ростовых, и зазвучали шаги запоздавшего мужчины. «Вот он Курагин!» прошептал Шиншин. Графиня Безухова улыбаясь обернулась к входящему. Наташа посмотрела по направлению глаз графини Безуховой и увидала необыкновенно красивого адъютанта, с самоуверенным и вместе учтивым видом подходящего к их ложе. Это был Анатоль Курагин, которого она давно видела и заметила на петербургском бале. Он был теперь в адъютантском мундире с одной эполетой и эксельбантом. Он шел сдержанной, молодецкой походкой, которая была бы смешна, ежели бы он не был так хорош собой и ежели бы на прекрасном лице не было бы такого выражения добродушного довольства и веселия. Несмотря на то, что действие шло, он, не торопясь, слегка побрякивая шпорами и саблей, плавно и высоко неся свою надушенную красивую голову, шел по ковру коридора. Взглянув на Наташу, он подошел к сестре, положил руку в облитой перчатке на край ее ложи, тряхнул ей головой и наклонясь спросил что то, указывая на Наташу.
– Mais charmante! [Очень мила!] – сказал он, очевидно про Наташу, как не столько слышала она, сколько поняла по движению его губ. Потом он прошел в первый ряд и сел подле Долохова, дружески и небрежно толкнув локтем того Долохова, с которым так заискивающе обращались другие. Он, весело подмигнув, улыбнулся ему и уперся ногой в рампу.
– Как похожи брат с сестрой! – сказал граф. – И как хороши оба!
Шиншин вполголоса начал рассказывать графу какую то историю интриги Курагина в Москве, к которой Наташа прислушалась именно потому, что он сказал про нее charmante.
Первый акт кончился, в партере все встали, перепутались и стали ходить и выходить.
Борис пришел в ложу Ростовых, очень просто принял поздравления и, приподняв брови, с рассеянной улыбкой, передал Наташе и Соне просьбу его невесты, чтобы они были на ее свадьбе, и вышел. Наташа с веселой и кокетливой улыбкой разговаривала с ним и поздравляла с женитьбой того самого Бориса, в которого она была влюблена прежде. В том состоянии опьянения, в котором она находилась, всё казалось просто и естественно.
Голая Элен сидела подле нее и одинаково всем улыбалась; и точно так же улыбнулась Наташа Борису.
Ложа Элен наполнилась и окружилась со стороны партера самыми знатными и умными мужчинами, которые, казалось, наперерыв желали показать всем, что они знакомы с ней.
Курагин весь этот антракт стоял с Долоховым впереди у рампы, глядя на ложу Ростовых. Наташа знала, что он говорил про нее, и это доставляло ей удовольствие. Она даже повернулась так, чтобы ему виден был ее профиль, по ее понятиям, в самом выгодном положении. Перед началом второго акта в партере показалась фигура Пьера, которого еще с приезда не видали Ростовы. Лицо его было грустно, и он еще потолстел, с тех пор как его последний раз видела Наташа. Он, никого не замечая, прошел в первые ряды. Анатоль подошел к нему и стал что то говорить ему, глядя и указывая на ложу Ростовых. Пьер, увидав Наташу, оживился и поспешно, по рядам, пошел к их ложе. Подойдя к ним, он облокотился и улыбаясь долго говорил с Наташей. Во время своего разговора с Пьером, Наташа услыхала в ложе графини Безуховой мужской голос и почему то узнала, что это был Курагин. Она оглянулась и встретилась с ним глазами. Он почти улыбаясь смотрел ей прямо в глаза таким восхищенным, ласковым взглядом, что казалось странно быть от него так близко, так смотреть на него, быть так уверенной, что нравишься ему, и не быть с ним знакомой.
Во втором акте были картины, изображающие монументы и была дыра в полотне, изображающая луну, и абажуры на рампе подняли, и стали играть в басу трубы и контрабасы, и справа и слева вышло много людей в черных мантиях. Люди стали махать руками, и в руках у них было что то вроде кинжалов; потом прибежали еще какие то люди и стали тащить прочь ту девицу, которая была прежде в белом, а теперь в голубом платье. Они не утащили ее сразу, а долго с ней пели, а потом уже ее утащили, и за кулисами ударили три раза во что то металлическое, и все стали на колена и запели молитву. Несколько раз все эти действия прерывались восторженными криками зрителей.
Во время этого акта Наташа всякий раз, как взглядывала в партер, видела Анатоля Курагина, перекинувшего руку через спинку кресла и смотревшего на нее. Ей приятно было видеть, что он так пленен ею, и не приходило в голову, чтобы в этом было что нибудь дурное.
Когда второй акт кончился, графиня Безухова встала, повернулась к ложе Ростовых (грудь ее совершенно была обнажена), пальчиком в перчатке поманила к себе старого графа, и не обращая внимания на вошедших к ней в ложу, начала любезно улыбаясь говорить с ним.
– Да познакомьте же меня с вашими прелестными дочерьми, – сказала она, – весь город про них кричит, а я их не знаю.
Наташа встала и присела великолепной графине. Наташе так приятна была похвала этой блестящей красавицы, что она покраснела от удовольствия.
– Я теперь тоже хочу сделаться москвичкой, – говорила Элен. – И как вам не совестно зарыть такие перлы в деревне!
Графиня Безухая, по справедливости, имела репутацию обворожительной женщины. Она могла говорить то, чего не думала, и в особенности льстить, совершенно просто и натурально.
– Нет, милый граф, вы мне позвольте заняться вашими дочерьми. Я хоть теперь здесь не надолго. И вы тоже. Я постараюсь повеселить ваших. Я еще в Петербурге много слышала о вас, и хотела вас узнать, – сказала она Наташе с своей однообразно красивой улыбкой. – Я слышала о вас и от моего пажа – Друбецкого. Вы слышали, он женится? И от друга моего мужа – Болконского, князя Андрея Болконского, – сказала она с особенным ударением, намекая этим на то, что она знала отношения его к Наташе. – Она попросила, чтобы лучше познакомиться, позволить одной из барышень посидеть остальную часть спектакля в ее ложе, и Наташа перешла к ней.
В третьем акте был на сцене представлен дворец, в котором горело много свечей и повешены были картины, изображавшие рыцарей с бородками. В середине стояли, вероятно, царь и царица. Царь замахал правою рукою, и, видимо робея, дурно пропел что то, и сел на малиновый трон. Девица, бывшая сначала в белом, потом в голубом, теперь была одета в одной рубашке с распущенными волосами и стояла около трона. Она о чем то горестно пела, обращаясь к царице; но царь строго махнул рукой, и с боков вышли мужчины с голыми ногами и женщины с голыми ногами, и стали танцовать все вместе. Потом скрипки заиграли очень тонко и весело, одна из девиц с голыми толстыми ногами и худыми руками, отделившись от других, отошла за кулисы, поправила корсаж, вышла на середину и стала прыгать и скоро бить одной ногой о другую. Все в партере захлопали руками и закричали браво. Потом один мужчина стал в угол. В оркестре заиграли громче в цимбалы и трубы, и один этот мужчина с голыми ногами стал прыгать очень высоко и семенить ногами. (Мужчина этот был Duport, получавший 60 тысяч в год за это искусство.) Все в партере, в ложах и райке стали хлопать и кричать изо всех сил, и мужчина остановился и стал улыбаться и кланяться на все стороны. Потом танцовали еще другие, с голыми ногами, мужчины и женщины, потом опять один из царей закричал что то под музыку, и все стали петь. Но вдруг сделалась буря, в оркестре послышались хроматические гаммы и аккорды уменьшенной септимы, и все побежали и потащили опять одного из присутствующих за кулисы, и занавесь опустилась. Опять между зрителями поднялся страшный шум и треск, и все с восторженными лицами стали кричать: Дюпора! Дюпора! Дюпора! Наташа уже не находила этого странным. Она с удовольствием, радостно улыбаясь, смотрела вокруг себя.