Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ макрос Π² растС

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π² ΠΈΠ³Ρ€Π΅ Rust: Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅?

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΈ Ρ‡ΠΈΡ‚Ρ‹ – раковая ΠΎΠΏΡƒΡ…ΠΎΠ»ΡŒ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΈΠ³Ρ€Π°Ρ…. БСзусловно, всСгда Π΅ΡΡ‚ΡŒ Ρ‚Π΅ ΠΈΠ³Ρ€ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π΄Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ прСимущСство Π½Π°Π΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ, Π΄Π°ΠΆΠ΅ Π½Π΅ самым чСстным способом. Π”Π°Π²Π°ΠΉΡ‚Π΅ вспомним ΠΈΠ³Ρ€Ρƒ Grand Theft Auto 5, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Ρ‘ Online ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ. Π£ΠΆ Π½Π΅ знаю, ΠΊΠ°ΠΊ Π² Π½Π΅ΠΉ Π΄Π΅Π»Π° обстоят Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π½ΠΎ Π³ΠΎΠ΄-Π΄Π²Π° Π½Π°Π·Π°Π΄ читСрство Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΈΠ³Ρ€Π΅ Π±Ρ‹Π»ΠΎ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ‹Π΄Π΅Π½Π½Ρ‹ΠΌ.

Π”Π°, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π°-Ρ‚Ρ€ΠΈ Π³ΠΎΠ΄Π° послС Ρ€Π΅Π»ΠΈΠ·Π° ΠΈΠ³Ρ€Ρ‹ Π½Π° ПК ΠΈΠ³Ρ€ΠΎΠΊΠΈ ΠΈ ΡƒΠ΄ΠΈΠ²Π»ΡΠ»ΠΈΡΡŒ Ρ‡ΠΈΡ‚Π΅Ρ€Π°ΠΌ, ΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΈΡ… ΠΊΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΈΠ· сСссии, Π½ΠΎ ΡƒΠΆΠ΅ сСйчас ΠΎΡ‡Π΅Π½ΡŒ часто заходя Π½Π° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ сСрвСр я Π²ΠΈΠΆΡƒ надпись ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ Β«Π§ΠΈΡ‚Π΅Ρ€Ρ‹ Π΅ΡΡ‚ΡŒ? НакрутитС Π΄Π΅Π½Π΅Π³ ΠΏΠ»Π·Β».

Π‘ΡƒΠ΄Ρƒ чСстСн – я ΠΈ сам Π³Ρ€Π΅ΡˆΠ΅Π½. Π”Π²Π° Ρ€Π°Π·Π° я Π·Π°ΠΊΠ°Π·Ρ‹Π²Π°Π» ΠΏΡ€ΠΎΠΊΠ°Ρ‡ΠΊΡƒ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ пСрсонаТа, ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π½Π°ΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Π» ΠΈΠ³Ρ€ΠΎΠ²ΡƒΡŽ Π²Π°Π»ΡŽΡ‚Ρƒ ΠΈ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ софта. И Π·Π½Π°Π΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎ? GTA 5 ΠΌΠ½Π΅ ΡƒΠΆΠ΅ Π½Π°Π΄ΠΎΠ΅Π»Π°, Π° Π²ΠΈΠ½ΠΎΠΉ этому послуТило Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ мСня ΠΈ Ρ‚Π°ΠΊ ΡƒΠΆΠ΅ Π² Π½Π΅ΠΉ всё Π΅ΡΡ‚ΡŒ, ΠΌΠ½Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ Ρ‚Π°ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ. Π—Π°ΡˆΡ‘Π» Ρ€Π°Π· Π² Π³ΠΎΠ΄, посмотрСл обновлСния, Π²Ρ‹ΡˆΠ΅Π». Π’ΠΎΡ‚ Ρ‚Π°ΠΊ сСйчас ΠΈΠ³Ρ€Π°ΡŽ я Π² ГВА.

Но вСрнёмся ΠΊ ΠΈΠ³Ρ€Π΅ Rust. Π§Π°Ρ‰Π΅ всСго Π² нашСй любимой ΠΈΠ³Ρ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ макросников. Π§ΠΈΡ‚Π΅Ρ€Ρ‹ Ρ‚ΠΎΠΆΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ, Π½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΈ часто, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. А Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ макросники Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ‡Π°Ρ‰Π΅, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΆΠ΅ ΡƒΠ·Π½Π°Π΅ΠΌ ΠΏΡ€ΠΎ нашСго Π²Ρ€Π°Π³Π° побольшС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π² ΠΈΠ³Ρ€Π΅ Rust

ΠœΠ°ΠΊΡ€ΠΎΡ – софт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт Π·Π° вас ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ. Π’ нашСм случаС ΠΎΠ½ гасит ΠΎΡ‚Π΄Π°Ρ‡Ρƒ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌ ΠΎΡ€ΡƒΠΆΠΈΠΈ.

Π― Π½Π΅ Π±ΡƒΠ΄Ρƒ Π²Π°ΠΌ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Π³Π΄Π΅ Π½Π°ΠΉΡ‚ΠΈ макросы, Ρƒ ΠΊΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚ΡŒ ΠΈΡ…, Π΄Π° ΠΈ стоит Π»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈΡ… ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚ΡŒ. Π”Π°ΠΆΠ΅ ΠΏΡ€ΠΈ всём своём ΠΆΠ΅Π»Π°Π½ΠΈΠΈ я Π½Π΅ ΠΌΠΎΠ³Ρƒ, Π½Π΅ имСю ΠΏΡ€Π°Π²Π° Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. ЕстСствСнно, люди ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½Ρ‹ макросы Π½Π°ΠΉΠ΄ΡƒΡ‚ ΠΈΡ…, Π½ΠΎ ΠΏΡƒΡΡ‚ΡŒ ΡƒΠΆ ΠΎΠ½ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ потратят своё врСмя ΠΈ дСньги, Π½Π΅ΠΆΠ΅Π»ΠΈ это Π±ΡƒΠ΄Ρƒ Π΄Π΅Π»Π°Ρ‚ΡŒ я.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° макросов Π² РастС

Π’ Ρ‡Ρ‘ΠΌ ΠΆΠ΅ прСимущСство людСй с макросами Π² Rust ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌΠΈ? Π”Π° всё элСмСнтарно – простой ΠΈΠ³Ρ€ΠΎΠΊ Π½Π΅ смоТСт Π·Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ с ΠΏΡƒΠ»Π΅ΠΌΡ‘Ρ‚Π° Π½Π° 300 ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², попадая ΠΏΡ€ΠΈ этом Π² ΠΎΠ΄Π½Ρƒ Ρ‚ΠΎΡ‡ΠΊΡƒ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΅ΡΡ‚ΡŒ ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ люди, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ мастСра ΠΏΠΎ ΡΡ‚Ρ€Π΅Π»ΡŒΠ±Π΅ Π² ΠΎΠ΄Π½Ρƒ Ρ‚ΠΎΡ‡ΠΊΡƒ, Π½ΠΎ Π½Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΆΠ΅ ΠΈΠ³Ρ€ΠΎΠΊ Ρ‚Π°ΠΊ стрСляСт. ΠœΠ°ΠΊΡ€ΠΎΡΠ½ΠΈΠΊΠΈ ΠΆΠ΅ сразу послС установки софта ΠΌΠΎΠ³ΡƒΡ‚ Ρ…ΠΎΡ‚ΡŒ всю ΠΊΠ°Ρ€Ρ‚Ρƒ ΠΏΠΎΠ»ΠΈΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Π΄ΠΎΠΌ ΠΏΡƒΠ»ΡŒ.

Как Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с макросниками

Π‘ΠΎΡ€ΡŒΠ±Π° с макросниками – слоТноС Π΄Π΅Π»ΠΎ, Ссли Π²Ρ‹ простой ΠΈΠ³Ρ€ΠΎΠΊ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ ΠΏΡ€ΠΈ встрСчС макросника ΠΎΡ‚ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ Π½Π° Π½Π΅Π³ΠΎ ΠΆΠ°Π»ΠΎΠ±Ρƒ. Π£ нас ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ, Π³Π΄Π΅ ΠΌΡ‹ описали, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ систСма ΠΆΠ°Π»ΠΎΠ± Π² Rust.

Если Π²Ρ‹ ΠΈΠ³Ρ€Π°Π΅Ρ‚Π΅ Π½Π° ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ сСрвСрС, Ρ‚ΠΎ Ρ‚Π°ΠΌ, скорСС всСго, Π΅ΡΡ‚ΡŒ модСрация, которая ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Π°ΡˆΡƒ ΠΆΠ°Π»ΠΎΠ±Ρƒ, Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, ΠΈ, Ссли ΠΌΠΎΠ΄Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ макросы, Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΊΠ°Π·Π°Π½ ΠΏΠΎ всСй строгости Π·Π°ΠΊΠΎΠ½Π°, Ρ…ΠΎΡ‚ΡŒ ΠΈ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ. ΠšΠΎΡ€ΠΎΡ‡Π΅, забанят нСгодяя.

Но ΠΊΠ°ΠΊ ΠΆΠ΅ с Π½ΠΈΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΡΡ‚Ρ€Π΅Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ? Π›ΠΈΡ‡Π½ΠΎ я дСлаю это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ – Π½Π΅ ΠΌΠΎΠ³Ρƒ Π²Π·ΡΡ‚ΡŒ ΡΡ‚Ρ€Π΅Π»ΡŒΠ±ΠΎΠΉ, ΡΡ‹Π³Ρ€Π°ΡŽ ΠΎΡ‚ Ρ‚Π°ΠΊΡ‚ΠΈΠΊΠΈ. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ быстро ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ°, Π·Π°ΠΊΠΈΠ΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π΄Ρ‹ΠΌΠ°ΠΌΠΈ ΠΈ Π³Ρ€Π°Π½Π°Ρ‚Π°ΠΌΠΈ, Π±Π»Π°Π³ΠΎ Π΅ΡΡ‚ΡŒ Π³Ρ€Π°Π½Π°Ρ‚ΠΎΠΌΡ‘Ρ‚.

Если ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΊ макроснику практичСски Π²ΠΏΠ»ΠΎΡ‚Π½ΡƒΡŽ, Ρ‚ΠΎ Ρ‚ΡƒΡ‚ ΡƒΠΆΠ΅ ваши ΡˆΠ°Π½ΡΡ‹ ΡƒΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ. Π‘ΡƒΠ΄Π΅Ρ‚ достаточно Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρƒ ΠΏΡƒΠ»ΡŒ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ это сдСлаСт ваш ΠΎΠΏΠΏΠΎΠ½Π΅Π½Ρ‚.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π² ΠΈΠ³Ρ€Π΅ Rust Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ

НС Ρ‚Π°ΠΊ Π΄Π°Π²Π½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Rust Π²Π²Π΅Π»ΠΈ сущСствСнныС ограничСния ΠΏΠΎ использованию ΠΌΡ‹ΡˆΠ΅ΠΊ Bloody, X7 ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ макросы Ρ‡Π΅Ρ€Π΅Π· встроСнноС ПО. Π’Π°ΠΊΠΈΠ΅ дСвайсы Π±Ρ‹Π»ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ Π·Π°ΠΉΡ‚ΠΈ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ сСрвСры, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² нСльзя! Π­Ρ‚ΠΎ сдСлано с Ρ†Π΅Π»ΡŒΡŽ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² ΠΎΡ‚ макросников. Из-Π·Π° этого появился вопрос β€” ΠΊΠ°ΠΊ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ с ΠΌΡ‹ΡˆΠΊΠΎΠΉ Π±Π»Π°Π΄ΠΈ Π² раст? Π•ΡΡ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π»Π΅Π³Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹ для всСх ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ: ΠΈ Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΊΠΎΠΉ, Π½ΠΎ макросы Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚, ΠΈ для Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅Π² сСрвСров (Π·Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ всС Π½Π° сСрвСр). Π£ нас Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ, Π³Π΄Π΅ ΠΌΡ‹ описали, ΠΊΠ°ΠΊ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Π² rust с ΠΌΡ‹ΡˆΠΊΠΎΠΉ bloody. Π’Π°ΠΌ ΠΌΡ‹ рассказали ΠΏΡ€ΠΎ ΠΎΠ±Ρ…ΠΎΠ΄ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΡ‹ΡˆΠΊΠΈ bloody rust, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅ Π±Π»Π°Π΄ΠΈ Π² раст.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Rust: Π·Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ макросы

Как-Ρ‚ΠΎ я сказал своСму ΠΊΠΎΠ»Π»Π΅Π³Π΅, Ρ‡Ρ‚ΠΎ Π² Rust ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ макросы, Π΅ΠΌΡƒ показалось, Ρ‡Ρ‚ΠΎ это ΠΏΠ»ΠΎΡ…ΠΎ. РаньшС Ρƒ мСня Π±Ρ‹Π»Π° такая ΠΆΠ΅ рСакция, Π½ΠΎ Rust ΠΏΠΎΠΊΠ°Π·Π°Π» ΠΌΠ½Π΅, Ρ‡Ρ‚ΠΎ макросы Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ»ΠΎΡ…ΠΈ.

Π“Π΄Π΅ ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… умСстно ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ? Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚ΠΎΠΌ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΠ°ΡΠ°Ρ‚ΡŒΡΡ макросов

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„ΠΎΡ€ΠΌΠΎΠΉ мСтапрограммирования: ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ΠΎΠΌ. ΠœΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎ ΠΏΠ»ΠΎΡ…ΡƒΡŽ Ρ€Π΅ΠΏΡƒΡ‚Π°Ρ†ΠΈΡŽ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΡ… использовании Π½Π΅Π»Π΅Π³ΠΊΠΎ ΡƒΠ±Π΅Ρ€Π΅Ρ‡ΡŒΡΡ ΠΎΡ‚ написания ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ слуТат #define Π² C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ нСпрСдсказуСмым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΠ»ΠΈ eval Π² JavaScript, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ ΠΊΠΎΠ΄Π°.

О макросах Π² Rust

МногиС ΠΈΡ… этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½Ρ‹ ΠΏΡ€ΠΈ использовании Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… срСдств, макросы ΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊΠΈΠ΅ срСдства:

ΠŸΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ имССтся Π΄Π²Π° Ρ‚ΠΈΠΏΠ° макросов являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ подходят для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π·Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡:

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ макросы

Π—Π°Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ? НуТно ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ макросы Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ с функциями β€” ΠΎΠ½ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ…, макросы, Π±Ρ‹Π»ΠΎ Π»Π΅Π³Ρ‡Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ вопрос стоит Π½Π΅ Π² Ρ‚ΠΎΠΌ, Π»ΡƒΡ‡ΡˆΠ΅ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ макросов Ρ‡Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Π° Π² Ρ‚ΠΎΠΌ, Π½ΡƒΠΆΠ½Π° Π»ΠΈ Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Π½ΡΡ‚ΡŒ исходный ΠΊΠΎΠ΄.

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ утвСрТдСния

Π”Π°Π½Π½ΠΎΠ΅ сообщСниС содСрТит Π² сСбС условиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ провСряСм. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, макрос создаСт сообщСниС ΠΎΠ± ошибкС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ основано Π½Π° исходном ΠΊΠΎΠ΄Π΅, ΠΌΡ‹ ΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сообщСниС ΠΎΠ± ошибкС, Π½Π΅ вставляя Π΅Π³ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

Π’ΠΈΠΏΠΎ-бСзопасная Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ строк

Π›Π΅Π³ΠΊΠΎΠ΅ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ вдадимся Π² экосистСму языка. Rust ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ log, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ логирования. Как ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для логирования, ΠΎΠ½ прСдоставляСт Ρ€Π°Π·Π½Ρ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ логирования, Π½ΠΎ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, Π΄Π°Π½Π½Ρ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ макросами, Π° Π½Π΅ функциями.

Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ мСтапрограммирования Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ макросы file! ΠΈ line! ; Π”Π°Π½Π½Ρ‹Π΅ макросы Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ мСсто располоТСния Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ логирования Π² исходном ΠΊΠΎΠ΄Π΅. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π’Π°ΠΊ ΠΊΠ°ΠΊ log являСтся Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ΠΎΠΌ, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ бэкСнд, ΠΏΠ°ΠΊΠ΅Ρ‚ flexi_logger.

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚:

Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, наши Π»ΠΎΠ³ΠΈ содСрТат ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° строк.

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС компилятор вставляСт Π² исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈ нСобходимости Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ. Если Π±Ρ‹ ΠΌΡ‹ Π½Π΅ Ρ€Π΅ΡˆΠ°Π»ΠΈ Π΄Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π²ΠΎ врСмя компиляции, Ρ‚ΠΎ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΌΡ‹ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ стСк Π²ΠΎ врСмя выполнСния, Ρ‡Ρ‚ΠΎ Ρ‡Ρ€Π΅Π²Π°Ρ‚ΠΎ ошибками ΠΈ сниТаСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Если ΠΌΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π»ΠΎΠ³ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ макросы Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ file! ΠΈ line! :

А Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π²Ρ‹Π²Π΅Π» Π±Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹Π΅ макросы

Rust Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ΅Π½ для ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ ΠΊΠΎΠ΄Π°. НапримСр, функция тСстирования выглядит Ρ‚Π°ΠΊ:

Запуск cargo test запустит Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. АтрибутивныС макросы ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ «Ρ€ΠΎΠ΄Π½Ρ‹ΠΌ» Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ эффСкты. На Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ сущСствуСт Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅: Π² компиляторС ΠΈΠ· Π²Π΅Ρ‚ΠΊΠΈ stable Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ макросы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ derive, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² Π½ΠΎΡ‡Π½Ρ‹Ρ… сборках. Рассмотрим Ρ€Π°Π·Π½ΠΈΡ†Ρƒ Π½ΠΈΠΆΠ΅.

Рассматривая прСимущСства, Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ макросами, цСлСсообразно ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исходным ΠΊΠΎΠ΄ΠΎΠΌ, с Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ это Π΄Π΅Π»Π°Ρ‚ΡŒ.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (boilerplate)

Derive с прСимущСствами

derive являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΌΠ½ΠΎΠ³ΠΈΡ… возмоТностСй Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ макросами, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ°ΠΆΠ΅ΠΉ. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ это доступно Π² Π½ΠΎΡ‡Π½Ρ‹Ρ… сборках, Ρ‡Ρ‚ΠΎ, надСюсь, Π±ΡƒΠ΄Π΅Ρ‚ стабилизировано Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Π³ΠΎΠ΄Ρƒ.

НаиболСС Π²Ρ‹Π΄Π°ΡŽΡ‰ΠΈΠΌΡΡ случаСм использования Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ являСтся Rocket β€” Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для написания Π²Π΅Π±-сСрвСров. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ REST-endpoint’ΠΎΠ² Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ добавлСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ функция содСрТит всю Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запроса.

НСдостатки

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π½Π΅ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹, рассмотрим ΠΈΡ… Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСдостатки:

Π’Ρ‹Π²ΠΎΠ΄Ρ‹

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠΎΡ‰Π½Ρ‹ΠΌ инструмСнтом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. НадСюсь, смог Π²Π½ΡƒΡˆΠΈΡ‚ΡŒ Π²Π°ΠΌ ΠΌΡ‹ΡΠ»ΡŒ, Ρ‡Ρ‚ΠΎ макросы Π² Rust ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ явлСниСм ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ случаи, ΠΊΠΎΠ³Π΄Π° ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ умСстно.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ЧСрная магия мСтапрограммирования: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ макросы Π² Rust 1.15

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ макрос Π² растС. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ макрос Π² растС. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ макрос Π² растС. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ макрос Π² растС. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ макрос Π² растСВ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ познакомились с ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· самых интСрСсных возмоТностСй языка Rust β€” ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌΠΈ макросами.

Как ΠΈ ΠΎΠ±Π΅Ρ‰Π°Π», сСгодня я расскаТу ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ макросы ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ Π² Ρ‡Π΅ΠΌ ΠΈΡ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΠ΅Ρ‡Π°Π»ΡŒΠ½ΠΎ извСстных макросов прСпроцСссора Π² C/C++.

Но сначала пройдСмся ΠΏΠΎ Ρ€Π΅Π»ΠΈΠ·Ρƒ 1.15 ΠΈ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π²Π°Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΎΠ½ΠΈ оказались Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ вострСбованы.

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ?

Π―Π·Ρ‹ΠΊ Rust развиваСтся ΠΎΡ‡Π΅Π½ΡŒ интСнсивно. Π˜Π·Π΄Π°Ρ‚Π΅Π»ΠΈ, Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½ΠΎ, Π½Π΅ ΡƒΡΠΏΠ΅Π²Π°ΡŽΡ‚ ΠΈ Π½Π΅ бСрутся Π²Ρ‹ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ½ΠΈΠ³ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΡƒΡΡ‚Π°Ρ€Π΅Π²Π°ΡŽΡ‚ Π΅Ρ‰Π΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π½Π° страницах высохнСт краска.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ большая Ρ‡Π°ΡΡ‚ΡŒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ прСдставлСна Π² элСктронном Π²ΠΈΠ΄Π΅. Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ источником ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ являСтся Книга, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° вопросы Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ². Для совсСм частых вопросов прСдусмотрСн Ρ€Π°Π·Π΄Π΅Π» FAQ.

Π’Π΅ΠΌ, ΠΊΡ‚ΠΎ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ‹Ρ‚ программирования Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ достаточно взрослый, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ другая ΠΊΠ½ΠΈΠ³Π°. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ΄Π°Π΅Ρ‚ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠΉΡ‚ΠΈ Π½Π° смСну ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅. А Ρ‚Π΅ΠΌ, ΠΊΠΎΠΌΡƒ нравится ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ Rust by Example.

Π›ΡŽΠ΄ΡΠΌ, Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌ с C++, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ интСрСсна ΠΊΠ½ΠΈΠ³Π°, Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅ porting guide, ΡΡ‚Π°Ρ€Π°ΡŽΡ‰Π°ΡΡΡ ΠΏΠΎΠ΄Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π² сравнСнии с C++ ΠΈ Π΄Π΅Π»Π°ΡŽΡ‰Π°Ρ Π°ΠΊΡ†Π΅Π½Ρ‚ Π½Π° различиях языков ΠΈ Π½Π° Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Rust Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠ΅.

Если вас интСрСсуСт история развития языка ΠΈ взгляд с Ρ‚ΠΎΠΉ стороны Π±Π°Ρ€Ρ€ΠΈΠΊΠ°Π΄, ΠΊΡ€Π°ΠΉΠ½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π±Π»ΠΎΠ³ΠΈ Aaron Turon ΠΈ Niko Matsakis. РСбята ΠΏΠΈΡˆΡƒΡ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΆΠΈΠ²Ρ‹ΠΌ языком ΠΈ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… языка ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ прСдполагаСтся ΠΈΡ… Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ. Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΈΠ· этих Π±Π»ΠΎΠ³ΠΎΠ² ΡƒΠ·Π½Π°Π΅ΡˆΡŒ ΠΊΡƒΠ΄Π° большС Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Ρ‡Π΅ΠΌ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… источников.

НаконСц, Ссли Π²Ρ‹ Π½Π΅ Π±ΠΎΠΈΡ‚Π΅ΡΡŒ Π΄Ρ€Π°ΠΊΠΎΠ½ΠΎΠ² ΠΈ Ρ‚Π΅ΠΌΠ½Ρ‹Ρ… ΡƒΠ³Π»ΠΎΠ², Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° Растономикон. Волько ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽ, послС прочтСния этой ΠΊΠ½ΠΈΠ³ΠΈ Π²Ρ‹ ΡƒΠΆΠ΅ Π½Π΅ смоТСтС ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Rust ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, я отвлСкся…

НовоС в Rust 1.15

Π‘ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° выпуска 1.14 ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 6 нСдСль. Π—Π° это врСмя Π² Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· успСли Π²ΠΎΠΉΡ‚ΠΈ 1443 ΠΏΠ°Ρ‚Ρ‡Π° (нСслабо, ΠΏΡ€Π°Π²Π΄Π°?) ΠΈΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π±Π°Π³ΠΈ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Π΅ возмоТности. А Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Π½Π° днях появился ΠΈ хотфикс 1.15.1, с нСбольшими, Π½ΠΎ Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ исправлСниями.

Π—Π° подробностями ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ страницС анонса ΠΈΠ»ΠΈ ΠΊ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΌΡƒ описанию ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (changelog). Π—Π΄Π΅ΡΡŒ ΠΆΠ΅ ΠΌΡ‹ сконцСнтрируСмся Π½Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹Ρ… измСнСниях.

Cargo ΡƒΠΆΠ΅ взрослый

CистСма сборки компилятора ΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Rust Π±Ρ‹Π»Π° пСрСписана Π½Π° сам Rust с использованиСм Cargo β€” стандартного ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΈ систСмы сборки, принятой Π² экосистСмС Rust.

Π‘ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Cargo являСтся систСмой сборки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π­Ρ‚ΠΎ Π±Ρ‹Π» Π΄ΠΎΠ»Π³ΠΈΠΉ процСсс, Π½ΠΎ ΠΎΠ½ Π½Π°ΠΊΠΎΠ½Π΅Ρ†-Ρ‚ΠΎ принСс свои ΠΏΠ»ΠΎΠ΄Ρ‹. Авторы ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ новая систСма сборки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ с дСкабря ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° Π² master Π²Π΅Ρ‚ΠΊΠ΅ рСпозитория ΠΈ ΠΏΠΎΠΊΠ° всС ΠΈΠ΄Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ.

Π£ΠΆΠ΅ Π΄Π°ΠΆΠ΅ Π·Π°Π²Π΅Π»ΠΈ ΡƒΠΆΠ΅ Π²ΠΌΠ΅Ρ€ΠΆΠΈΠ»ΠΈ pull request Π½Π° ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ всСх makefile; интСграция Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π° Π½Π° Ρ€Π΅Π»ΠΈΠ· 1.17.

ВсС это Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ ΠΏΠΎΡ‡Π²Ρƒ ΠΊ прямому использованию ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈΠ· crates.io для сборки компилятора, ΠΊΠ°ΠΊ ΠΈ Π² любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. А Π΅Ρ‰Π΅ это нСплохая дСмонстрация возмоТностСй Cargo.

НовыС Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ использования Rust Π² embedded ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ компилятора ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ сообщСство для выяснСния потрСбностСй этой ΠΏΠΎΠΊΠ° малочислСнной, Π½ΠΎ Π²Π°ΠΆΠ½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

БыстрСС! Π’Ρ‹ΡˆΠ΅! БильнСС!

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ стал быстрСС. А Π½Π΅Π΄Π°Π²Π½ΠΎ Π΅Ρ‰Π΅ ΠΈ объявили ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ систСма ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ компиляции ΠΏΠ΅Ρ€Π΅ΡˆΠ»Π° Π² Ρ„Π°Π·Ρƒ Π±Π΅Ρ‚Π°-тСстирования. На ΠΌΠΎΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… врСмя компиляции послС Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΎΡΡŒ с

4 сСкунд, хотя ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠ° всС Π΅Ρ‰Π΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎΠ΅ врСмя. Пока ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ компиляция Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½ΠΎΡ‡Π½Ρ‹Ρ… сборках ΠΈ сильно зависит ΠΎΡ‚ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π° зависимостСй, Π½ΠΎ прогрСсс Ρ€Π°Π΄ΡƒΠ΅Ρ‚.

Алгоритм slice::sort() Π±Ρ‹Π» пСрСписан ΠΈ стал Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ, Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ, Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС. Π’Π΅ΠΏΠ΅Ρ€ΡŒ это гибридная сортировка, рСализованная ΠΏΠΎΠ΄ влияниСм Timsort. РаньшС использовалась обычная сортировка слияниСм.

Π’ C++ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ шаблона для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π½ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ ограничСния Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для спСциализации этого шаблона. Π Π°Π±ΠΎΡ‚Ρ‹ Π² этом Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ вСдутся, Π½ΠΎ ΠΏΠΎΠΊΠ° всС ΠΎΡ‡Π΅Π½ΡŒ слоТно.

Π‘Ρ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Rust всСгда ΡƒΠΌΠ΅Π» Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ограничСния Ρ‚ΠΈΠΏΠ°ΠΆΠ΅ΠΉ, Π½ΠΎ с Π½Π΅Π΄Π°Π²Π½ΠΈΡ… ΠΏΠΎΡ€ появилась Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ, Ссли ΠΎΠ½Π° Π·Π°Π΄Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ строгиС ограничСния. Π­Ρ‚ΠΎ позволяСт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ для частных случаСв, Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Ρ ΠΏΡ€ΠΈ этом ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ интСрфСйс.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° IDE

Π­Ρ‚ΠΎΠ³ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚ Π² ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΌ Rust, Π½ΠΎ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π½ΠΎΠ²ΠΎΡΡ‚ΡŒ слишком Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎ Π½Π΅ΠΉ ΡƒΠΌΠΎΠ»Ρ‡Π°Ρ‚ΡŒ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Rust Language Server объявили ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π°Π»ΡŒΡ„Π°-вСрсии своСго Π΄Π΅Ρ‚ΠΈΡ‰Π°.

Language Server Protocol это стандартный ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°ΠΌ ΠΈ срСдам Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ языкС с компиляторами. Он абстрагируСт Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ Π°Π²Ρ‚ΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ, Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³, Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π±ΡƒΡ„Π΅Ρ€Π°ΠΌΠΈ ΠΈ Ρ‚.Π΄.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ любой Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΈΠ»ΠΈ IDE, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ LSP автоматичСски ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ всСх LSP-совмСстимых языков.

Π£ΠΆΠ΅ сСйчас ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ возмоТности Π½Π° совмСстимых Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°Ρ…, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Π²Ρ‚ΠΎΡ€Ρ‹ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽΡ‚ остороТно ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ своим Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΈΠ±ΠΎ ΠΊΠΎΠ΄ Π΅Ρ‰Π΅ довольно сырой.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π² Rust

ВСрнСмся ΠΊ нашим Π±Π°Ρ€Π°Π½Π°ΠΌ.

Π‘ самого Π½Π°Ρ‡Π°Π»Π° программисты Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ помСньшС, Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ побольшС. Π’ Ρ€Π°Π·Π½ΠΎΠ΅ врСмя ΠΏΠΎΠ΄ этим ΠΏΠΎΠ½ΠΈΠΌΠ°Π»ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ, Π½ΠΎ условно ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° сокращСния ΠΊΠΎΠ΄Π°:

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ большС соотвСтствуСт Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ: Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΊΠΎΠ΄Π° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, классы ΠΈ Ρ‚. ΠΏ.

К Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ отнСсти макросы, ΠΈΠ½ΠΊΠ»ΡƒΠ΄Ρ‹ ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠΉ прСпроцСссинг. Π’ языкС Rust для этого прСдусмотрСно Ρ‚Ρ€ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°:

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ макросы (Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ macro by example) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° хочСтся ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ повторСния ΠΎΠ΄Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π½ΠΎ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ, Π»ΠΈΠ±ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ vec! ΠΈΠ»ΠΈ println! ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Ρ‚Π°ΠΊΠΈΡ… макросов. Π—Π°Π΄Π°ΡŽΡ‚ΡΡ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ сопоставлСния ΠΈ подстановки ΠΏΠΎ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ. РСализация основана Π½Π° Π±Π°Π·Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ 1986-Π³ΠΎ Π³ΠΎΠ΄Π°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ своС ΠΏΠΎΠ»Π½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅.

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΎΠΉ стабилизации интСрфСйса ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² компилятора. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… макросов, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π½Π° Rust, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся Π² процСссС компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся Π½Π°Π±ΠΎΡ€ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ². Π­Ρ‚ΠΈ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ компилятор Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ подстановки макроса.

ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ компилятора ΡΠ²Π»ΡΡŽΡ‚ΡΡ самым ΠΌΠΎΡ‰Π½Ρ‹ΠΌ, Π½ΠΎ слоТным ΠΈ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ (Π² смыслС API) срСдством, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ доступно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½ΠΎΡ‡Π½Ρ‹Ρ… сборках компилятора. Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ римских Ρ†ΠΈΡ„Ρ€ Π² качСствС числовых Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ макроса

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ макросы Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ лСксичСским контСкстом Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ опрСдСлСния ΠΈ для Π±ΠΎΠ»Π΅Π΅ высокоуровнСвых сущностСй. НапримСр, макросом ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΉ impl Π±Π»ΠΎΠΊ, ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ вмСстС с ΠΈΠΌΠ΅Π½Π΅ΠΌ, списком ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния.

ΠœΠ°ΠΊΡ€ΠΎ-вставки Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ практичСски Π²ΠΎ всСх мСстах ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ модуля:

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ довольно часто ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…, ΠΊΠΎΠ³Π΄Π° приходится ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Π΅ конструкции, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡΠ΅Ρ€ΠΈΡŽ impl для стандартных Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

НапримСр, Π² стандартной Π±ΠΈΠ±ΠΈΠ»ΠΎΡ‚Π΅ΠΊΠ΅ Rust макросы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ³ΠΎ объявлСния Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ°ΠΆΠ° PartialEq для всСвозмоТных сочСтаний срСзов, массивов ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ²:

Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ΠΌΠ΅Ρ‚Π°ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… позволяСт Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ примСнимости макроса, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚Π»ΠΎΠ²ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ошибки.

ВстрСтив Π² ΠΊΠΎΠ΄Π΅ использованиС макроса, компилятор Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ Ρ‚Ρƒ Π²Π΅Ρ‚Π²ΡŒ, которая ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ случая ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ Π² Π΄Π΅Ρ€Π΅Π²Π΅ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ макроса Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ подстановки. Если Π² Ρ‚Π΅Π»Π΅ макроса подходящСй конструкции Π½Π΅ нашлось, компилятор сгСнСрируСт осмыслСнноС сообщСниС ΠΎΠ± ошибкС.

Чистота ΠΈ порядок

ΠœΠ°ΠΊΡ€ΠΎΡ Π² Rust Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ написан Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ лСксичСски ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ всякий Π½Π°Π±ΠΎΡ€ символов ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌ макросом. Π­Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с использованиСм прСпроцСссора Π² C/C++.

Π’ Π±Π΅Π·ΠΎΠ±ΠΈΠ΄Π½ΠΎΠΌ с Π²ΠΈΠ΄Ρƒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° ΠΌΡ‹ вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта Π²Ρ‹Ρ‚Π°Ρ‰ΠΈΠ»ΠΈ Π΄Π²Π°, вычислили Π½Π΅ Ρ‚ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ, Π° послСднСй строкой Π΅Ρ‰Π΅ ΠΈ спровоцировали Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π’Ρ€ΠΈ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… ошибки Π½Π° Π΄Π²Π΅ строки ΠΊΠΎΠ΄Π° β€” это ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠ²Π°Ρ‚ΠΎ.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ синтСтичСский, Π½ΠΎ ΠΌΡ‹ всС прСкрасно Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ постоянная смСна Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΈ людСй Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΏΡƒΡ‚Π°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ Π½Π΅ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄.

ΠšΠΎΡ€Π΅Π½ΡŒ Π·Π»Π° Π»Π΅ΠΆΠΈΡ‚ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ прСпроцСссор C/C++ ΠΎΡ€ΡƒΠ΄ΡƒΠ΅Ρ‚ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ тСкста, Π° компилятору приходится Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΡ€Ρ‡Π΅Π½Π½ΡƒΡŽ прСпроцСссором ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

Напротив, макросы Π² Rust Ρ€Π°Π·Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ самим компилятором ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ синтаксичСского Π΄Π΅Ρ€Π΅Π²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ описанныС Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅.

Π’Π°ΠΊΠΈΠ΅ макросы Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π½Ρ‹ΠΌΠΈ. Одним ΠΈΠ· слСдствий являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ макрос Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π²ΠΈΠ΄ΠΈΠΌΡƒΡŽ Π·Π° Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ.

Π—Π°Ρ‚ΠΎ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… макроса ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π½Π΅ пСрСсСкутся с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π²Ρ‹ΡˆΠ΅ ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ. НапримСр, описанный Π²Ρ‹ΡˆΠ΅ макрос vec! ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ с использованиСм ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Для простоты рассмотрим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Π²Π΅Ρ‚Π²ΡŒ:

послС подстановки макроса Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Π²

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы

Когда возмоТностСй ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… макросов нСдостаточно, Π² Π±ΠΎΠΉ ΠΈΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅.

Как ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано Π²Ρ‹ΡˆΠ΅, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ вмСсто простой подстановки ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ выполнСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΡ‹ ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ.

Π’ качСствС ΠΏΠΎΠ΄ΠΎΠΏΡ‹Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΡ€ΠΎΠ»ΠΈΠΊΠ° возьмСм Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ автоматичСски Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ конструктора #[derive(new)] ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ использованиС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ #[derive(new)] ΠΌΡ‹ попросили компилятор ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ вывСсти… Π° Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ? ΠžΡ‚ΠΊΡƒΠ΄Π° компилятор ΠΏΠΎΠΉΠΌΠ΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ? Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ.

Для Π½Π°Ρ‡Π°Π»Π° заглянСм Π² исходный ΠΊΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊ ΡΡ‡Π°ΡΡ‚ΡŒΡŽ ΠΎΠ½ Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ большой:

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Π΅Π³ΠΎ ΠΏΠΎ косточкам ΠΈ попытаСмся ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚.

Π”Π°Π»Π΅Π΅ слСдуСт собствСнно функция, Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰Π°Ρ Π² Ρ€ΠΎΠ»ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос:

На Π²Ρ…ΠΎΠ΄ ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈΠ· компилятора, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Ρ‚Π΅Π»ΠΎ макроса. На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ компилятор ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½Π°Π±ΠΎΡ€ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ примСнСния макроса. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, функция derive() Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ своСобразный Ρ„ΠΈΠ»ΡŒΡ‚Ρ€.

Если чСстно, я Ρ‚ΠΎΠΆΠ΅ Π½Π΅ понимаю, Π·Π°Ρ‡Π΅ΠΌ Ρ‚Π°ΡΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΡƒΠ΄Π°-сюда Ρ‡Π΅Ρ€Π΅Π· строки ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ нСльзя Π±Ρ‹Π»ΠΎ сразу ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ вмСняСмый интСрфСйс, Π½Ρƒ Π΄Π° Π»Π°Π΄Π½ΠΎ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ситуация измСнится.

Π˜Ρ‚Π°ΠΊ, Π½Π° Π²Ρ…ΠΎΠ΄ Π½Π°ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄Π°Ρ‚ΡŒ:

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΊΠΎΠ΄, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ подстановку для ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ структуры. Π—Π΄Π΅ΡΡŒ ΠΊΠΎΠ΄ Π΄Ρ€ΠΎΠ±ΠΈΡ‚ΡŒ ΡƒΠΆΠ΅ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ, поэтому я Π²ΡΡ‚Π°Π²Π»ΡŽ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ прямо Π² тСкст:

Вся Ρ…ΠΈΡ‚Ρ€ΠΎΡΡ‚ΡŒ здСсь Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² макросС quote! ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Ρ†ΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠ΄Π°, подставляя вмСсто сСбя Π½Π°Π±ΠΎΡ€ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ². ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΌΠ΅Ρ‚Π°ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с Ρ€Π΅ΡˆΠ΅Ρ‚ΠΊΠΈ. Они унаслСдованы ΠΈΠ· лСксичСского контСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится Ρ†ΠΈΡ‚Π°Ρ‚Π°.

Π‘Π°ΠΌΠ° структура Π΅Ρ‰Π΅ Ρ€Π°Π·:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ примСнСния ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ макроса:

Π’Π½Π΅Π·Π°ΠΏΠ½ΠΎ, всС становится Π½Π° свои мСста. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ собствСнноручно сгСнСрировали impl Π±Π»ΠΎΠΊ для структуры, Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² Π½Π΅Π³ΠΎ Π°ΡΡΠΎΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-конструктор new() с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ (!), двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ x ΠΈ y ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π°ΡˆΡƒ структуру, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ инициализируя Π΅Π΅ поля значСниями ΠΈΠ· своих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Rust ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈΠ· контСкста, Ρ‡Π΅ΠΌΡƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ x ΠΈ y Π΄ΠΎ ΠΈ послС двоСточия, всС компилируСтся ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

Π’ качСствС упраТнСния, ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π΄Π²Π΅ Π²Π΅Ρ‚Π²ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прСдстоит Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ. ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π΅Ρ€ΡˆΠΈΠ½Π° айсбСрга ΠΈ самый прямолинСйный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования. Π•ΡΡ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ интСрСсныС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, ΠΊΠ°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ сборщика мусора, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ лСксичСскими срСдствами языка Rust.

НадСюсь, Ρ‡Ρ‚ΠΎ ΡΡ‚Π°Ρ‚ΡŒΡ оказалась Π²Π°ΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ. А Ссли послС Π΅Π΅ прочтСния Π²Ρ‹ Π΅Ρ‰Π΅ ΠΈ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒΡΡ с языком Rust, я Π±ΡƒΠ΄Ρƒ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ свою Π·Π°Π΄Π°Ρ‡Ρƒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ πŸ™‚

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ совмСстно с Π”Π°Ρ€ΡŒΠ΅ΠΉ Π©Π΅Ρ‚ΠΈΠ½ΠΈΠ½ΠΎΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ макросов (ΠœΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ)

Π•Π³ΠΎ нСльзя Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ любоС количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Но ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ синтаксичСского сокращСния для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ это сокращСниС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ макрос: actual

Ого, Ρ‚ΡƒΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ синтаксиса! Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Π΅Π³ΠΎ.

БопоставлСниС (Matching) (Бинтаксис Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρ‹)

ΠœΠ°ΠΊΡ€ΠΎΡ опрСдСляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ряда ΠΏΡ€Π°Π²ΠΈΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ сопоставлСния с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ. Π’Ρ‹ΡˆΠ΅ Ρƒ нас Π±Ρ‹Π»ΠΎ

Π—Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ синтаксиса сопоставлСния с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ, Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты Rust, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Π·Ρ†Π΅, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π² точности ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ. НапримСр,

ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции

Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ (Expansion) (Бинтаксис прСобразования ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρ‹)

Π‘ ΠΏΡ€Π°Π²ΠΎΠΉ стороны ΠΌΠ°ΠΊΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΏΠΎ большСй части, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ синтаксис Rust. Но ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ кусочки Ρ€Π°Π·Π΄Ρ€ΠΎΠ±Π»Π΅Π½Π½ΠΎΠ³ΠΎ синтаксиса, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈ сопоставлСнии с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ. Из ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° Π΄Π΅Ρ‚Π°Π»ΡŒ: макрос vec! ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ ΠΏΠ°Ρ€Ρ‹ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках ΠΏΡ€Π°Π²ΠΎΠΉ части. Они часто ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ скобки ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ синтаксиса. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ макрос vec! ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² контСкстС выраТСния. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π±Π»ΠΎΠΊ, для записи выраТСния с мноТСствСнными ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, Π² Ρ‚ΠΎΠΌ числС Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ let привязки. Если ваш макрос раскрываСтся Π² ΠΎΠ΄Π½ΠΎ СдинствСнноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ слой скобок Π½Π΅ Π½ΡƒΠΆΠ΅Π½.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ макрос создаСт выраТСния. На самом Π΄Π΅Π»Π΅, это Π½Π΅ опрСдСляСтся, ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ макрос Π² качСствС выраТСния. Если ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ макрос, развСрнутая Ρ„ΠΎΡ€ΠΌΠ° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π°Π»ΠΈΠ΄Π½Π° сразу Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… контСкстах. НапримСр, сокращСнная Ρ„ΠΎΡ€ΠΌΠ° для Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π½ΠΎΠΉ ΠΈ ΠΊΠ°ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈ ΠΊΠ°ΠΊ шаблон.

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ (Repetition) (ΠœΠ½ΠΎΠ³ΠΎΠ²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ)

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π° всСгда ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° основных ΠΏΡ€Π°Π²ΠΈΠ»Π°:

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΡ‡ΡƒΠ΄Π»ΠΈΠ²Ρ‹ΠΉ макрос ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ дублирования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ· Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ повторСния.

Π­Ρ‚Π° систСма ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ основана Π½Π° Β«Macro-by-ExampleΒ» (PDF ссылка).

Π“ΠΈΠ³ΠΈΠ΅Π½Π° (Hygiene)

Π”Ρ€ΡƒΠ³ΠΎΠΉ распространСнной ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π² систСмС макросов являСтся Π·Π°Ρ…Π²Π°Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (variable capture). Π’ΠΎΡ‚ C макрос, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ GNU C Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ эмулируСт Π±Π»ΠΎΠΊΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈΠΉ Π² Rust.

Π’ΠΎΡ‚ простой случай использования, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ»ΠΎΡ…ΠΎ ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒΡΡ:

Вторая пСрСмСнная с ΠΈΠΌΠ΅Π½Π΅ΠΌ state затСняСт ΠΏΠ΅Ρ€Π²ΡƒΡŽ. Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ трСбуСтся ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π½ΠΈΠΌ ΠΎΠ±ΠΎΠΈΠΌ.

Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½Ρ‹ΠΉ макрос Π² Rust ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ.

Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Rust ΠΈΠΌΠ΅Π΅Ρ‚ систСму макросов с соблюдСниСм Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹. РаскрытиС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ макроса происходит Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ контСкстС синтаксиса, ΠΈ каТдая пСрСмСнная ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ контСкста синтаксиса, Π³Π΄Π΅ ΠΎΠ½Π° Π±Ρ‹Π»Π° Π²Π²Π΅Π΄Π΅Π½Π°. Π­Ρ‚ΠΎ ΠΊΠ°ΠΊ Ссли Π±Ρ‹ пСрСмСнная state Π²Π½ΡƒΡ‚Ρ€ΠΈ main Π±Ρ‹Π»Π° Π±Ρ‹ ΠΎΠΊΡ€Π°ΡˆΠ΅Π½Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Β«Ρ†Π²Π΅Ρ‚Β» Π² ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅ ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ state Π²Π½ΡƒΡ‚Ρ€ΠΈ макроса, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ ΠΎΠ½ΠΈ Π±Ρ‹ Π½Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Π»ΠΈ.

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ возмоТности макросов для внСдрСния Π½ΠΎΠ²Ρ‹Ρ… связываний ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½Π° мСстС Π²Ρ‹Π·ΠΎΠ²Π°. Код, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ:

ВмСсто этого Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅, Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ контСкста синтаксиса.

Π­Ρ‚ΠΎ справСдливо для let привязок ΠΈ ΠΌΠ΅Ρ‚ΠΎΠΊ loop, Π½ΠΎ Π½Π΅ для элСмСнтов. Код, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅, компилируСтся:

РСкурсия макросов

РаскрытиС макроса Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² сСбя Π²Ρ‹Π·ΠΎΠ²Ρ‹ макросов, Π² Ρ‚ΠΎΠΌ числС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ‚ΠΎΠ³ΠΎ макроса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ раскрываСтся. Π­Ρ‚ΠΈ рСкурсивныС макросы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° этом (ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΌ) HTML сокращСниС:

ΠžΡ‚Π»Π°Π΄ΠΊΠ° макросов

log_syntax!(. ) Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ свои Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² стандартный Π²Ρ‹Π²ΠΎΠ΄ Π²ΠΎ врСмя компиляции, ΠΈ Β«Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡΒ» Π² Π½ΠΈΡ‡Ρ‚ΠΎ.

trace_macros!(true) Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ сообщСниС компилятора ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° макрос развСртываСтся. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ trace_macros!(false) Π² ΠΊΠΎΠ½Ρ†Π΅ развСртывания, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ.

ВрСбования синтаксиса

Код Π½Π° Rust ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½ Π² синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ содСрТит Π½Π΅Ρ€Π°Π·Π²Ρ‘Ρ€Π½ΡƒΡ‚Ρ‹Π΅ макросы. Π­Ρ‚ΠΎ свойство ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… инструмСнтов, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… исходный ΠΊΠΎΠ΄. Оно Ρ‚Π°ΠΊΠΆΠ΅ влияСт Π½Π° Π²ΠΈΠ΄ систСмы макросов Rust.

Как слСдствиС, ΠΊΠΎΠ³Π΄Π° компилятор Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² макроса, Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ, Π²ΠΎ Ρ‡Ρ‚ΠΎ развСрнётся Π΄Π°Π½Π½Ρ‹ΠΉ макрос. ΠœΠ°ΠΊΡ€ΠΎΡ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Π’Ρ‹Π·ΠΎΠ² макроса Π² Π±Π»ΠΎΠΊΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой элСмСнты, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€. Rust ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ простоС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой нСоднозначности. Π’Ρ‹Π·ΠΎΠ² макроса, производящСго элСмСнты, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈΠ±ΠΎ

Π”Ρ€ΡƒΠ³ΠΎΠ΅ слСдствиС Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΏΠ΅Ρ€Π΅Π΄ раскрытиСм макросов β€” это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² макроса Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· допустимых лСксСм. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, скобки всСх Π²ΠΈΠ΄ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сбалансированы Π² мСстС Π²Ρ‹Π·ΠΎΠ²Π°. НапримСр, foo!([) Π½Π΅ являСтся Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ позволяСт компилятору ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π³Π΄Π΅ заканчиваСтся Π²Ρ‹Π·ΠΎΠ² макроса.

Говоря Π±ΠΎΠ»Π΅Π΅ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Ρ‚Π΅Π»ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° макроса Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² лСксСм. Π”Π΅Ρ€Π΅Π²ΠΎ лСксСм опрСдСляСтся рСкурсивно ΠΈ прСдставляСт собой Π»ΠΈΠ±ΠΎ:

Π’Π½ΡƒΡ‚Ρ€ΠΈ сопоставлСния каТдая мСтапСрСмСнная ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° совпадаСт. Π’ΠΎΡ‚ список этих ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ:

Π•ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ лСксСм, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π° ΠΌΠ΅Ρ‚Π°ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ синтаксиса Rust Π±Π΅Π· нСобходимости ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ макросы.

ΠžΠ±Π»Π°ΡΡ‚ΠΈ видимости, ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΈ экспорт макросов

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° Ρ€Π°Π½Π½Π΅ΠΉ стадии компиляции, ΠΏΠ΅Ρ€Π΅Π΄ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠΌΡ‘Π½. Один ΠΈΠ· нСдостатков Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° видимости для макросов ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΈΠ» для Π΄Ρ€ΡƒΠ³ΠΈΡ… конструкций языка.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ опрСдСляСт ΠΈ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ макросы ΠΏΡ€ΠΈ ΠΎΠ±Ρ…ΠΎΠ΄Π΅ Π³Ρ€Π°Ρ„Π° исходного ΠΊΠΎΠ΄Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ. ΠŸΡ€ΠΈ этом опрСдСлСния макросов Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² Π³Ρ€Π°Ρ„ Π² порядкС ΠΈΡ… встрСчи компилятором. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ макрос, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ модуля, Π²ΠΈΠ΄Π΅Π½ Π²ΠΎ всём ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ модуля, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ‚Π΅Π»Π° всСх Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ( mod ).

ΠœΠ°ΠΊΡ€ΠΎΡ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ»ΠΈ Π³Π΄Π΅-Ρ‚ΠΎ Π΅Ρ‰Ρ‘ Π½Π΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ модуля, Π²ΠΈΠ΄Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ этого элСмСнта (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ).

Если макрос ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ…, всё становится Π΅Ρ‰Ρ‘ слоТнСС. Допустим, mylib опрСдСляСт

Π’ΠΎ Ρ‚ΡŒΠΌΠ΅ Π³Π»ΡƒΠ±ΠΈΠ½

Вводная Π³Π»Π°Π²Π° ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»Π° рСкурсивныС макросы, Π½ΠΎ ΠΎΠ½Π° Π½Π΅ рассказывала всСй истории. РСкурсивныС макросы ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π΅Ρ‰Ρ‘ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ рСкурсивный Π²Ρ‹Π·ΠΎΠ² Π΄Π°Ρ‘Ρ‚ Π½Π°ΠΌ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Ρƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ макроса.

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘ΠΌ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Π΄Π°Π½Π½ΠΎΠΉ возмоТности. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСкурсивных макросов ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ Ρ‚ΠΈΠΏΠ° Bitwise Cyclic Tag. Π‘Ρ‚ΠΎΠΈΡ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π° просто ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ возмоТности макросов.

Π’ качСствС упраТнСния ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ макрос, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ дублирования ΠΊΠΎΠ΄Π° Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π²Ρ‹ΡˆΠ΅.

РаспространённыС макросы

Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ распространённыС макросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π² ΠΊΠΎΠ΄Π΅ Π½Π° Rust.

panic!

Π­Ρ‚ΠΎΡ‚ макрос Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ°Π½ΠΈΠΊΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ сообщСниС, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ:

ΠœΠ°ΠΊΡ€ΠΎΡ vec! ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ всСй ΠΊΠ½ΠΈΠ³Π΅, поэтому Π²Ρ‹ навСрняка ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ Π΅Π³ΠΎ. Он ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ созданиС Vec :

Он Ρ‚Π°ΠΊΠΆΠ΅ позволяСт Π²Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ с ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ значСниями. НапримСр, Π²ΠΎΡ‚ сто Π½ΠΎΠ»Π΅ΠΉ:

assert! and assert_eq!

Π­Ρ‚ΠΈ Π΄Π²Π° макроса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² тСстах. assert! ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. assert_eq! ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° значСния ΠΈ провСряСт, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ€Π°Π²Π½Ρ‹. true засчитываСтся ΠΊΠ°ΠΊ успСх, Π° false Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ°Π½ΠΈΠΊΡƒ ΠΈ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°Π΅Ρ‚ тСст. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ:

Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ читаСтся Π»Π΅Π³Ρ‡Π΅, Ρ‡Π΅ΠΌ этот:

unreachable!

Π­Ρ‚ΠΎΡ‚ макрос примСняСтся, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ:

Иногда Π²Π°ΠΌ придётся ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π²Π΅Ρ‚Π²ΠΈ условных конструкций, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ исполнятся. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ этот макрос, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² случаС ошибки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°ΠΏΠ°Π½ΠΈΠΊΠΎΠ²Π°Π»Π°:

unimplemented!

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы

Если систСма макросов Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΊ компилятору. По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с макросами, это Π³ΠΎΡ€Π°Π·Π΄ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅, Ρ‚Π°ΠΌ Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ интСрфСйсы, ΠΈ Π΅Ρ‰Ρ‘ слоТнСС Π½Π°ΠΉΡ‚ΠΈ ошибки. Π—Π°Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ β€” Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° Rust. Иногда ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ синтаксиса Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌΠΈ макросами.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *