Size: a a a

2020 April 28

DS

Doge Shibu in rust_offtopic
polunin.ai
я вижу вызов функции assertImpl
assertImpl - это и есть макрос
источник

p

polunin.ai in rust_offtopic
Doge Shibu
assertImpl - это и есть макрос
def это объявление макроса?
источник

AZ

Alex Zhukovsky in rust_offtopic
Т-34 85
И как, им это понравилось?
да
источник

DS

Doge Shibu in rust_offtopic
polunin.ai
def это объявление макроса?
def - это обьявление функции
источник

AZ

Alex Zhukovsky in rust_offtopic
Т-34 85
@Psilon макросы нужны в шарпе?
ну я обхожусь апи компилятора, это те макросы которые доге рекламировал - типизированные с аст
источник

DS

Doge Shibu in rust_offtopic
макрос в скале - это обычная функция
источник

DS

Doge Shibu in rust_offtopic
Которая вызвается в компайлтайме через использование '{ } и ${ } в inline фукнциях
источник

p

polunin.ai in rust_offtopic
Doge Shibu
макрос в скале - это обычная функция
ну я и сказал, макрос это вызов функции в рантайме обычный, на вход которому подают АСТ
источник

DS

Doge Shibu in rust_offtopic
polunin.ai
ну я и сказал, макрос это вызов функции в рантайме обычный, на вход которому подают АСТ
Не в рантайме
источник

DS

Doge Shibu in rust_offtopic
В компайл тайме
источник

p

polunin.ai in rust_offtopic
Doge Shibu
Не в рантайме
то есть это if($expr) проверяет выражение в компайл тайме?
источник

DS

Doge Shibu in rust_offtopic
polunin.ai
то есть это if($expr) проверяет выражение в компайл тайме?
Нет, смотри как оно работает:

1. У тебя есть inline def assert(...) - это функция работает и раскрывается целиком в компайл тайме.
2. У неё в теле есть ${ assertImpl('expr) }, это запись значит: в компайл тайме всунуть сюда тот Expr[Unit], что вёрнет assertImpl. А 'expr - значит в компайл тайме разобрать expr и перевести его в Expr[Unit]
3. Тело assertImpl - это функция из Expr[Boolean] в Expr[Unit],
'{ ... } - значит, представь, что внутри скобок как Expr, $expr - значит вставь в этот Expr, дерево expr  как оно есть.
источник

p

polunin.ai in rust_offtopic
понял, круто
источник

DS

Doge Shibu in rust_offtopic
polunin.ai
то есть это if($expr) проверяет выражение в компайл тайме?
А вообще прочитай то, что по ссылке написано, оно там лучше описано, чем я это сейчас делаю:
https://dotty.epfl.ch/docs/reference/metaprogramming/macros.html#macros-quotes-and-splices

Прям вот эти первые абзацы
источник

DS

Doge Shibu in rust_offtopic
Там про квотирование и сплайсинг (syn и quote работают точно так же, если что)
источник

p

polunin.ai in rust_offtopic
Doge Shibu
Нет, смотри как оно работает:

1. У тебя есть inline def assert(...) - это функция работает и раскрывается целиком в компайл тайме.
2. У неё в теле есть ${ assertImpl('expr) }, это запись значит: в компайл тайме всунуть сюда тот Expr[Unit], что вёрнет assertImpl. А 'expr - значит в компайл тайме разобрать expr и перевести его в Expr[Unit]
3. Тело assertImpl - это функция из Expr[Boolean] в Expr[Unit],
'{ ... } - значит, представь, что внутри скобок как Expr, $expr - значит вставь в этот Expr, дерево expr  как оно есть.
хм, ну это же просто
macro_rules! assert {
 ($e:expr) => {  if !$expr { println!("Err") } }
}
Не?
источник

DS

Doge Shibu in rust_offtopic
polunin.ai
хм, ну это же просто
macro_rules! assert {
 ($e:expr) => {  if !$expr { println!("Err") } }
}
Не?
Тот пример - да.

Только в отличие от macro_rules он не сводит IDE с ума. Но можно делать более веселые вещи, с разбором деревьев, доставанием из них типов и полноценной работы с ними.
источник

p

polunin.ai in rust_offtopic
Doge Shibu
Тот пример - да.

Только в отличие от macro_rules он не сводит IDE с ума. Но можно делать более веселые вещи, с разбором деревьев, доставанием из них типов и полноценной работы с ними.
а как если все внутри '{} возвращается как поток токенов?
источник

DS

Doge Shibu in rust_offtopic
polunin.ai
а как если все внутри '{} возвращается как поток токенов?
Не поток токенов, а дерево выражений языка.
источник

S

Soul in rust_offtopic
а nix хорош!
источник