Здравствуйте, Mr.Delphist, Вы писали:
C>>И где тут строгость? Просто идиотское ограничение — оба массива идентичны.
MD>Похоже, насчёт строгой типизации нам говорить ещё рано
Верно замечено — вам, похоже, таки рано.
Там, где не рано, делают, например, так (близко к Ada)
type real = float;
type temperature = new float;
type altitude = new float;
type foo = struct {
bar: integer;
baz: float;
};
type buka = foo;
type ziuka = new foo;
и с этого момента buka — просто алиас для foo, а ziuka — намеренно отдельный тип, все имплицитные соответствия, конверсии и присвоения запрещены, то же для температуры (ей высоту просто так не присвоишь, матчинг функции не будет происходить, и так далее).
А теперь сюрприииз — в том самом Go, в котором вы увидели только duck typing, то же самое:
type real = float
type altitude float
type temperature float
type foo struct {
bar int
baz float
}
type buka = foo
type ziuka foo
с тем же результатом — buka идентичен foo (алиас для него), real = float во всём использовании, а вот ziuka, altitude и temperature отделены.
А изображать "строгую типизацию" разделением типов просто из-за идентичного объявления массива в двух местах... ну да, Вирту в Модуле такое приснилось. Только повторять это на трезвую голову никто не хочет.
MD> Синтаксис JS строже чем у Pascal... Разрешите тогда упомянуть классику: https://www.destroyallsoftware.com/talks/wat
Я не защищаю тут позицию Cyberaxʼа, но вы синтаксис от семантики не отличаете.
С синтаксисом у JS, таки, есть проблемы, но в другом, например:
return
1;
он вернёт null.
В ролике про WAT про это ни слова, там другие хохмы (да, реальные и грустные).
Кстати, ещё один из ваших мифов про Go:
MD> Go — основан на duck-typing (ещё бы, наследования-то не завезли)
Завезли:
A field declared with a type but no explicit field name is called an embedded field. An embedded field must be specified as a type name T or as a pointer to a non-interface type name *T, and T itself may not be a pointer type.
A field or method f of an embedded field in a struct x is called promoted if x.f is a legal selector that denotes that field or method f.
Given a struct type S and a defined type T, promoted methods are included in the method set of the struct as follows:
If S contains an embedded field T, the method sets of S and *S both include promoted methods with receiver T. The method set of *S also includes promoted methods with receiver *T.
If S contains an embedded field *T, the method sets of S and *S both include promoted methods with receiver T or *T.
И это наследование ещё и множественное. Вот виртуальных функций в нём, да, нет и не предвидится, поэтому по сравнению с традиционным наследованием типа C++/Java/etc. оно инвалидное.