Здравствуйте, novitk, Вы писали:
DM>> современный Swift
N> Он чем-то от C# отличается кроме нативной поддержки ADT? refcounting GC & llvm AOT это про рантайм.
Там вместо ООПшных интерфейсов — протоколы, подобные multiparameter type classes из хаскеля или traits из Раста. Когда можно свой интерфейс/трейт придумать и уже существующие чужие типы объявить, что они ему соответствуют, и как именно. И есть то, что хаскель называет existential types, а раст — dyn traits, когда передается "точно не знаю что, но оно умеет вот в этот интерфейс". Можно иметь "список хреней, умеющих то-то", причем это необязательно классы с общим предком, вообще не классы могут быть. Функция может возвращать разные неродственные типы, если они один протокол реализуют, такое вообще мало где есть.
Нет привычных исключений, но есть внешне похожие на них способы возвращать и передавать дальше ошибку, похоже на то, что в Zig.
Параметры у функций по умолчанию иммутабельны. Даже если передаешь объект с мутирующими методами, функция, куда передал, не сможет их вызвать. Нужно или явно разрешить мутирующий доступ, объявив параметр inout и передавая его как &x, или функция может сделать локальную копию, и мутировать ее, а оригинальный объект при этом не изменится.
Довольно неплохо сделаны optional types, которые на первый взгляд похожи на nullable, но на самом деле ближе к ФП-шным Maybe / option — они нестятся, потому Int? и Int?? это разные типы с разной информацией.