Маjко
Нет, он прав, что не для любого выражения можно однозначно определить тип
У выражения нет типа, тип есть у того, что выражение возвращает в lvalue
Маjко
Тип есть у токена: в макросах раста, например
Маjко
Выражение — это конструкция языка, а не объект системы типов языка
Oleg
У выражения нет типа, тип есть у того, что выражение возвращает в lvalue
Ты сейчас говоришь о выражениях на уровне синтаксического анализа?
Маjко
Я говорю о том что выражения это объект синтаксиса
Маjко
И они не типизированы
Маjко
Поскольку вылетают из AST задолго до анализа типов
Oleg
Мы под выражениями подразумеваем сейчас термы
Oleg
Вот у термов есть типы
Oleg
Эти "типы" один к одному соотносятся с типами значений, о которых ты говоришь, поэтому те и другие типы обычно не различают
Маjко
Время наглядных картиночек
Маjко
Маjко
У термов есть типы, последний терм в rvalue expression используется в операциях выше по AST
Маjко
Но экспрешн не типизирован, он вообще дальше синтаксиса не существует
Oleg
Ну вот во всяких лямда калькулюсах мы привыкли любую валидную комбинацию термов называть термом
Anonymous
эта терминология вообще не применяется в расте
Oleg
Поэтому любое синтаксически валидное выражение для синтаксического анализа и есть терм для внутреннего языка
Oleg
Может быть, когда оно ещё "выражение" у него ещё нет типов
Oleg
Но есть ли смысл так строго разделять эти этапы?
Маjко
эта терминология вообще не применяется в расте
По ссылке четко написано что выражение — это x + 1
Anonymous
1 тоже выражение
Маjко
Кто спорил?
Oleg
Вот в твоей терминологии применение макроса - это выражение, а то, что получится при его развороте уже может иметь тип, так?
Маjко
Если 1 — это rvalue, то он будет использован в lvalue expression
Маjко
Всё
Маjко
У 1 есть тип, однозначно
Маjко
Но это не значит что у выражения 1 есть тип
Маjко
Вот в твоей терминологии применение макроса - это выражение, а то, что получится при его развороте уже может иметь тип, так?
Не совсем, макросами занимается препроцессор. После разворота макроса будет нагенерено много токенов, которые дальше будут разобраны, проведен семантический анализ и из rvalue expression будут выдернуты последние термы
Oleg
Хотя нет, применение макроса, наверное, это тоже наверное, ещё до выражений
Маjко
Я поясню почему прикопался: возведение выражений на одну ступень с типизированными объектами может дать неверное впечатление что в расте позволительно взять и начать жонглировать выражениями (синтаксическими конструкциями)
Маjко
А раст не питон
Маjко
Он так не умеет
Маjко
Вот лямбда типизирована, ей можно покидаться между функциями
Oleg
В общем, это какой-то странный снобизм. В литературе и интернетах постоянно встречается "type of expression"
Маjко
А let a = x + 1 fn lol(a) передаст не выражение x + 1, а интеджер
Маjко
Хотя я даже в таком виде не встречал
Маjко
Только когда сравнивались разные формы записи выражений
Маjко
Читай синтаксиса
Маjко
В общем, это какой-то странный снобизм. В литературе и интернетах постоянно встречается "type of expression"
Это не снобизм, это банальная попытка объяснить, что не стоит оперировать малознакомыми терминами, ибо можно ввести в заблуждение собеседника. Я вот всерьез задумался что за типы там у выражений и пошел искать что я не знаю о расте, а ньюкамер может эту двусмысленность интерпретировать хрен пойми как
Маjко
Я хз что такое вложение, я знаю только что такое вложенная область видимости. У нее своё семантическое значение, никак не связанное с выражениями. Точно такое же как в других языках: во вложенной области видимости видно всё, что и верхнему контексту, но верхнему контексту не видно ничего во вложенной
Маjко
Задно вложенные области видимости (блоки кода) наделили свойством выражений, а именно что при нахождении в rvalue из них возвращается крайний term
Маjко
?
Маjко
Это свертки вроде по русской терминологии
Oleg
замыкания?
Ма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> Я сам не часто пишу на расте, но вроде так :)
Маjко
А () это единичный тип
Не уверен, но это возможно просто пустой тапл в языке
Oleg
Причем там может не только не Fn, но еще FnMut и FnOnce
Oleg
Они различаются способом владения контекста у замыкания
Ма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’. Для полноты изложения.