LINUX.ORG.RU

Макросы в расте

 ,


0

6

Знатоки раста, подскажите пожалуйста, как в макросах раста раскрыть блок и обработать элементы?
Т.е. я хочу вот такой вариант:

opt_m!({
  a <- f1();
  b <- f2();
  let c = a + b;
  mret(c);
})
транслировать в такой:
{
  let mut res = None;
  loop {
    let a = match f1() {
      Some(x) => x,
      None => break
    }
    let b = match f2() {
      Some(x) => x,
      None => break
    }
    let c = a + b;
    res = Some(c);
    break;
  }
  res
}

★★★★★

Ответ на: комментарий от Aswed

Там есть какой-нибудь аналог лисповского macroexpand?

Только флаг компилятору --pretty=expanded.

DarkEld3r ★★★★★
()
Ответ на: комментарий от Aswed

не понятно, как там раскрываются блоки.

Если честно, то я нуб в макросах и не совсем понимаю, что ты подразуемваешь под «раскрыть блок». Но по моему, сделать именно так как ты хочешь не получится. Так как в «a <- f1();» и в «let c = a + b;» будут разные а из-за гигиены. Может ошибаюсь, конечно.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Да, из-за странных правил гигиены. Максимум, что мне приходит в голову — это вот как-то так.

Вообще я думаю, что macro_rules — это как syntax-rules в Scheme. Отлично подходит для простых случаев. В принципе позволяет и более сложные вещи, но выходит слишком уж извращённо (как и с syntax-rules). Для чего-то нетривиального только плагины к компилятору.

anonymous
()

Наставят макросов, а ты потом ломай голову, что оно делает

JN
()
Ответ на: комментарий от DarkEld3r

да ни зачем походу. Я руст-то не знаю, а это мне компилятор насоветовал, пока я в него тыкался)

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.