Здравствуйте, vdimas, Вы писали:
VD>>Ерунду полнейшую говоришь. Опшон без пооблем может быть как сылочным, так и нет.
V>Т.е. если в Nemerle опишу некий свой variant MyOptional, это будет value-тип?
Value-option не обязан быть вариантом. В немерле он сделан просто структурой.
https://github.com/rsdn/nemerle/blob/master/lib/option.n#L217
В Немерле варианты сделаны на базе классов, но это одна из возможных реализаций.
V>Я правильно понимаю, что средствами языка, т.е. через variant, его нельзя было описать как value-тип?
У языка как бы средств больше чем одно. option ни разу не обязан быть ваниантом.
V>Я-то уже 100 лет на Немерле не смотрел, но если я понимаю правильно, то ты лишь удружил через ЧТД.
Ты себе что-то на придумывал и пытаешься это обосновать любыми путями.
V>А как ты отличаешь value-тип от ссылочного?
Как кота от кошки. Смотрю value-тип — говорю — "value-тип".
V>Т.е. вопрос в следующем: а как эти значения этих типов передаются в кач-ве аргументов функций — по ссылке или по-значению?
Не имеет значения. Передать вэлью-значение по ссылке не особо проблематично. Это детали реализации.
V>Надеюсь, суть вопроса понятна?
Понятна. Пытаешься придумать обосновании явно неверному утверждению.
V>1. Было сказано "в ФП языках".
Язык не имеет значения.
V>2. Variant не описан средствами VB, а "дан сверху", т.е. является встроенным для него.
Опять же не имеет значения.
V>Я тебе больше скажу. Генератор CORBA IDL или COM IDL генерит размеченные объединения как value-типы для С++.
V>Одно плохо — CORBA это тоже не про ФП-языки.
Ты себе придумал какой-то странный ценз "ФП-языки". Он только тебе интересен.
V>В общем, в двух словах. Не столько для тебя, сколько для читателей.
Ну, да. Как всем же ясно что ты прав и они хотят у гуру поучиться.
V>Основная фишка тут в том, что реализация объединения через условный value-тип будет занимать в памяти такой же размер, какой нужен для представления самого большого из вариантов + дискриминатор.
Ой-йо-йо. Великое горе! А любой объект в дотнете занимает 24 байта (под x64). И стало быть перерасход 1-2 интов не такая уж проблема. А там еще локальность памяти подтягивается, затраты на занятие памяти в куче и в друг оказывается, что потеря этих байтов просто фигня по сравнению с выигрышем.
Вот так и с ValueOption оказывается, что потеря 1-4 байта (занимаемого bool-ом в зависимости от выравнивания) — это ни что по сравнению с затратами на ссылочные типы.
VD>>Тот же Котлин, хотя и использует нулевую ссылку каксэ отсутствующее значение, интерпретирует, например, string и string? как разные типы. Это позволяет компилятору контролировать ошибки связанные с null–ами.
V>А тут не верно.
Только по-твоему.
V>Озвученное тобой говорит о том, что система типов Котлина НЕ контроллирует значение ссылочного типа, поэтому просто добавила ДРУГОЙ тип для non-nullable-ссылок.
Не говори ерунды. Система типов нигде значения не контролирует, так как значения сущность времени исполнения. Зато она контролирует отсутствие ошибок с этими значениями.
V>То, что в синтаксисе языка наоборот — т.е. как бэ nullable-тип видится как "другой" — это ж просто трюк такой, верно?
Какие на фиг трюки? Это система типов языка. Для этого языка это разные, хотя и связанные типы. Учись мыслить абстрактно. Система типов языка может отличаться от системы типов базовой платформы.
V>А так-то похожий трюк с введением ДРУГОГО типа я тоже в С++ тоже периодически делаю.
Да это где угодно можно. Вопрос лишь в удобстве использовании и загрузки компилятора ненужной работой.
В том же Колине кроме разведения типов еще есть ряд фич упрощающих жизнь с этим. Иначе эта была бы адова боль, а не работа.
Так у них можно проверить в if-е значение на null и компилятор сам подменит тип внутри true-секции этого if-f. Оберткой это не сделаешь. Или можно? Далее для null-абл значений есть лифтинг. Например, написав optionX?.Foo мы получим значение Foo поднятое в null-абл тип. И это можно проделывать сколько угодно долго. А потом можно просто проверить результат один раз или использовать оператор замены null-значений. Еще они проводят анализ библиотек Явы и вычисляют функции точно не возвращающие нулабл-типы. Всего этого на обертках не добьешся. В итоге получается разный класс решений. У тебя это примочка вызывающая боль при использовании, а у них стройная система.