C# 7 - названия и прочее
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.04.15 14:59
Оценка: 75 (6) +3 -1 :)
1. Поглядел тут предложения МС для C# и в очередной раз порадовался с того как заботливо в МС относятся к запутыванию пользователей.

Назвать записи (record-ы) кортежами (tuple-ами), а алгебраические типы record-ами — это по нашему!

Люди близкие к телу дизайнеров языка, доведите, плиз, до ведома авторов C#, что они делают ерунду. Во всех языках то что они назвали record называется как угодно, но не record. В ML (где они и родились) — tagged union. В Немерле — это variant-ы. В Скале — это case classes. В F# — discriminated unions.

Причем в F#, ML и Scala есть и record, но означают они совсем другое.

Зато то что в C# решено назвать кортежами (tuple) во всех перечисленных выше языках называется record-ами.

2. Хочется заметить, что ключевое слово record (да и любое другое) в C#-ных аналогах вариантов вообще не нужно. Стинаксически они отлично отличимы по круглым скобками "первичного конструктора".

3. Кортежи C# (которые, как мы выяснили, являются по сути записями) дублируют функциональность анонимных типов. Будет довольно криво иметь в язык две похожих вещи. Я бы на месте авторов языка просто доработал напильником анонимные типы сделав из них полноценные записи (в человеческом смысле этого слова).

Что нужно сделать на мой взгляд:
1. Доработать синтаксис описания типов для анонимного типа. Например подойдет вариант { int a, string b }.
2. Допилить рантайм донтета так чтобы он поддерживал структурные типы, т.е. ввести типы считающиеся эквивалентными при совпадении всех их полей. В таких типах должно быть ничего кроме полей. Ну, разве что допустить автосвойства. Никакого кода быть не должно потому, что его очень сложно сравнивать структурно. Да и не нужен в них код. Рантайм должен незаметно для всех подменять тип из всех сборок на тип из одной из них или как-то еще обеспечить полную совместимость между ними.

4. Имеет смысл реализовать в языке и обычные котежи (с неименованными полями). Это должен быть обычный сахар над имеющимися типами System.Tuple<...>. Этот пункт не обязательный, но разумный и желательный. Все полноценные ФЯ поддерживают котежи.

Поддержка будет отлично сочетаться с добавлением паттерн-матчинга, так как кортежи в нем являются довольно важной составляющей (один из видов паттеров — это по сути и есть кортеж).

5. Предлагаю добавить дженерики с переменным числом параметров, по анологии с C++ поледних версий. Это уже мое личное пожелание выходящее за рамки того что обсуждается на гитхабе, но эта фича была бы очень и очень полезной (если ее удалось бы реализовать). Причем реализовывать ее нужно, в первую очередь, опять же в рантайме дотнета, так как дженерики — это рантайм-сущость.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 29.04.2015 14:59 VladD2 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.