sab123: (Default)
[personal profile] sab123
Во Рже (Rust) макросы являются частью языка, и работают на самом деле не на исходном тексте программы, а уже на синтаксическом дереве разбора. Причем там есть два вида макросов - один определяется попроще, через pattern matching аргументов, другой заморачивается деревом как оно есть. Вот так выглядит определение макроса assert! (макросы там все вызываются восклицательным знаком) через два возможных паттерна, с одним аргументом и многими аргументами (в дополнительных аргументах можно дать сообщение об ошибке):

macro_rules! assert {
    ($cond:expr $(,)?) => {
        if !$cond {
            panic!("assertion failed: {}", stringify!($cond));
        }
    };
    ($cond:expr, $($arg:tt)+) => {
        if !$cond {
            panic!($($arg)+);
        }
    };
}


Через двоеточие в определении аргумента в паттерне указывается его тип.

У меня есть ощущение, что такими макросами наверное можно сделать аналог темплейтов из C++.

Date: 2026-01-16 04:26 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Боюсь, SFINAE макросам не по плечу.

January 2026

S M T W T F S
     12 3
45 6 7 8 9 10
11 12 13 14 151617
18192021222324
25262728293031

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 16th, 2026 01:11 pm
Powered by Dreamwidth Studios