Маjко
Тип есть у токена: в макросах раста, например
Маjко
Выражение — это конструкция языка, а не объект системы типов языка
Oleg
Маjко
Я говорю о том что выражения это объект синтаксиса
Маjко
И они не типизированы
Маjко
Поскольку вылетают из AST задолго до анализа типов
Oleg
Мы под выражениями подразумеваем сейчас термы
Oleg
Вот у термов есть типы
Oleg
Эти "типы" один к одному соотносятся с типами значений, о которых ты говоришь, поэтому те и другие типы обычно не различают
Маjко
Время наглядных картиночек
Маjко
Маjко
У термов есть типы, последний терм в rvalue expression используется в операциях выше по AST
Маjко
Но экспрешн не типизирован, он вообще дальше синтаксиса не существует
Oleg
Ну вот во всяких лямда калькулюсах мы привыкли любую валидную комбинацию термов называть термом
Anonymous
эта терминология вообще не применяется в расте
Oleg
Поэтому любое синтаксически валидное выражение для синтаксического анализа и есть терм для внутреннего языка
Oleg
Может быть, когда оно ещё "выражение" у него ещё нет типов
Oleg
Но есть ли смысл так строго разделять эти этапы?
Anonymous
1 тоже выражение
Маjко
Кто спорил?
Oleg
Вот в твоей терминологии применение макроса - это выражение, а то, что получится при его развороте уже может иметь тип, так?
Маjко
Если 1 — это rvalue, то он будет использован в lvalue expression
Маjко
Всё
Маjко
У 1 есть тип, однозначно
Маjко
Но это не значит что у выражения 1 есть тип
Oleg
Хотя нет, применение макроса, наверное, это тоже наверное, ещё до выражений
Маjко
Я поясню почему прикопался: возведение выражений на одну ступень с типизированными объектами может дать неверное впечатление что в расте позволительно взять и начать жонглировать выражениями (синтаксическими конструкциями)
Маjко
А раст не питон
Маjко
Он так не умеет
Маjко
Вот лямбда типизирована, ей можно покидаться между функциями
Oleg
В общем, это какой-то странный снобизм. В литературе и интернетах постоянно встречается "type of expression"
Маjко
А
let a = x + 1
fn lol(a)
передаст не выражение x + 1, а интеджер
Маjко
Маjко
Хотя я даже в таком виде не встречал
Маjко
Только когда сравнивались разные формы записи выражений
Маjко
Читай синтаксиса
Маjко
Я хз что такое вложение, я знаю только что такое вложенная область видимости.
У нее своё семантическое значение, никак не связанное с выражениями.
Точно такое же как в других языках: во вложенной области видимости видно всё, что и верхнему контексту, но верхнему контексту не видно ничего во вложенной
Маjко
Задно вложенные области видимости (блоки кода) наделили свойством выражений, а именно что при нахождении в rvalue из них возвращается крайний term
Маjко
?
Маjко
Это свертки вроде по русской терминологии
Oleg
замыкания?
Маjко
Замыкание, точно
Маjко
Маjко
let a = || x+1
lol(a)
передаст замыкание, у которого есть тип
Маjко
Какой только никто не знает))
Маjко
Да, смысл в этом. ПРоще их понять используя термин "анонимная функция"
Маjко
Считай что ты объявляешь новую функцию без имени
Маjко
В которой можно использовать внешний контекст (всё, что в области видимости в месте объявления)
Маjко
Нет, они автоматом захвативаются
в || идут аргументы
Маjко
let mut x = 1
let add = |n| x = x + n
add(1)
// x = 2
add(10)
// x = 10
Маjко
Что-то вроде того.
Маjко
Я не знаю точно как он выглядит, это только компилятору известно
Маjко
found type `[closure@src/main.rs:3:29: 3:47]
Маjко
Нет
Маjко
У каждого замыкания уникальный тип
Маjко
По этому не получится сделать например так
let closure = if true {
|| 5 + 5
} else {
|| 10 + 10
}
Маjко
Только если в Box обернуть и стереть реальный тип
Маjко
Нет
Маjко
В расте нельзя просто так кастовать ссылки
Маjко
Для указателей есть void
Маjко
А () это единичный тип
Маjко
Ты можешь создать объект этого типа
Маjко
Он применяется например, когда нужно через канал послать сообщение без данных
tx.send(())
Маjко
А хрен его знает, но получается в итоге насколько я знаю BoxFn
Маjко
Это разновидность Box<Trait>
Маjко
Но внутренняя
Маjко
Лучше книгу)
Oleg
Box<Fn(a, b) -> c> Я сам не часто пишу на расте, но вроде так :)
Oleg
Причем там может не только не Fn, но еще FnMut и FnOnce
Oleg
Они различаются способом владения контекста у замыкания
Anonymous
Маjко
Anonymous
() - unit
Anonymous
(n, ), (a, b, ..., n) - n-tuple
Oleg
https://doc.rust-lang.org/reference/types.html#tuple-types
For historical reasons and convenience, the tuple type with no elements (()) is often called ‘unit’ or ‘the unit type’.
Для полноты изложения.