К вопросу о "static typing" vs "dynamic typing"
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 23.09.04 11:48
Оценка: -2
Здравствуйте, DarkGray, Вы писали (http://www.rsdn.ru/Forum/Message.aspx?mid=762929&only=1):
Автор: DarkGray
Дата: 13.08.04


DG>Имхо, хорошая статическая типизация — это такая типизация, в которой можно по-максимуму задать ограничения на этапе компиляция.

DG>Замечу, что текущие языки не умеют "работать" даже с базовыми вещами.
DG>Пример 1:
DG>Определить функцию, которая принимает объект, который должен поддерживать и интерфейс IA, и интерфейс IB.
DG>Такое ограничение можно записать только с помощью generic-ов:
DG>
DG>void Method<T>(T value) where T:IA, IB {}
DG>

DG>Пример 2:
DG>Определить функцию, которая принимает объект, или типа C1, или типа C2.
DG>Такой пример даже с помощью generic-ов не записывается.


В Оберонах это есть. Вот, например, в Active Oberon for .NET
VAR x: OBJET;
    y: OBJECT{D};

x — переменная, которая может обозначать любой объект.
y — переменная, которая может обозначать любой объект реализующий интерфейс D. (Точнее не интерфейс, а DEFINITION — это нечто более крутое чем интерфейс, но в частном случае, может рассматриваться как интерфейс.)

PROCEDURE DoSmth(VAR x: OBJECT; VAR y: OBJECT{D, E});

У процедуры DoSmth первый аргумент x — любой объект; второй аргумент y — любой объект реализующий интерфейсы D и E одновременно.

"Приведение типов":
IF x IMPLEMENTS D THEN D(x).f(); ... END;


http://www.oberon.ethz.ch/oberon.net/whitepaper/
Re: К вопросу о "static typing" vs "dynamic typing"
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.09.04 13:03
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:
DG>>Определить функцию, которая принимает объект, или типа C1, или типа C2.
DG>>Такой пример даже с помощью generic-ов не записывается.
SYG>В Оберонах это есть. Вот, например, в Active Oberon for .NET
Неправда. Перечитай внимательно задачу.
SYG>У процедуры DoSmth первый аргумент x — любой объект; второй аргумент y — любой объект реализующий интерфейсы D и E одновременно.
Такое есть и в C#2.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: К вопросу о "static typing" vs "dynamic typing"
От: Quintanar Россия  
Дата: 23.09.04 14:35
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Здравствуйте, DarkGray, Вы писали (http://www.rsdn.ru/Forum/Message.aspx?mid=762929&amp;only=1):
Автор: DarkGray
Дата: 13.08.04


DG>>Имхо, хорошая статическая типизация — это такая типизация, в которой можно по-максимуму задать ограничения на этапе компиляция.

DG>>Замечу, что текущие языки не умеют "работать" даже с базовыми вещами.
DG>>Пример 1:
DG>>Определить функцию, которая принимает объект, который должен поддерживать и интерфейс IA, и интерфейс IB.
DG>>Такое ограничение можно записать только с помощью generic-ов:
DG>>
DG>>void Method<T>(T value) where T:IA, IB {}
DG>>

DG>>Пример 2:
DG>>Определить функцию, которая принимает объект, или типа C1, или типа C2.
DG>>Такой пример даже с помощью generic-ов не записывается.


Кстати, в Haskell'е возможны обе эти операции. Правда, 2-й случай ценой ошибок типа во время выполнения и ограничения типов до специального подмножества (неполиморфных типов).

1)
method:(IA a, IB a)=>a->a
method x = x

2)
import Data.Typeable

makeF2::(Typeable a, Typeable b, Typeable c)=>(b->b)->(a->a)->c->c
makeF2 f1 f2 = case cast f1 of
                        Just g1 -> g1
                        Nothing -> case cast f2 of
                                        Just g2 -> g2
                                        Nothing -> id

f_int::Int->Int
f_int x = x + 1


f_bool::Bool->Bool
f_bool x = not x

fg_func::(Typeable a)=>a->a
fg_func = makeF2 f_int f_bool

main = print ((show (fg_func (1::Int))) ++ (show (fg_func True)) ++ (show (fg_func 'a')))

makeF2 создает функцию, которая специальным образом работает на типах b и a, но в целом полиморфная (для всех остальных типов она просто возвращает значение).

f_int, f_bool — специализированные функции, на их основе мы создаем fg_func, которая специализирована для типов Bool и Int.

далее мы ее вызываем для 1, True и 'a' — вывод будет 2False'a', т.е. для 1 и True функция отработала особым образом, а для 'a' просто вернула значение.
Re: К вопросу о "static typing" vs "dynamic typing"
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 23.09.04 19:06
Оценка:
SYG>
SYG>PROCEDURE DoSmth(VAR x: OBJECT; VAR y: OBJECT{D, E});
SYG>

SYG>У процедуры DoSmth первый аргумент x — любой объект; второй аргумент y — любой объект реализующий интерфейсы D и E одновременно.

Как это будет восприниматься другими .Net-языков (например, C#-ом)?
Re[2]: К вопросу о "static typing" vs "dynamic typing"
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 24.09.04 07:21
Оценка:
Здравствуйте, DarkGray, Вы писали:

SYG>>
SYG>>PROCEDURE DoSmth(VAR x: OBJECT; VAR y: OBJECT{D, E});
SYG>>

SYG>>У процедуры DoSmth первый аргумент x — любой объект; второй аргумент y — любой объект реализующий интерфейсы D и E одновременно.

DG>Как это будет восприниматься другими .Net-языков (например, C#-ом)?


Спросите у Sinclair, он сказал, что "Такое есть и в C#2." http://www.rsdn.ru/Forum/Message.aspx?mid=821943&amp;only=1
Автор: Sinclair
Дата: 23.09.04
Re: К вопросу о "static typing" vs "dynamic typing"
От: Kluev  
Дата: 24.09.04 07:49
Оценка: 1 (1)
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Здравствуйте, DarkGray, Вы писали (http://www.rsdn.ru/Forum/Message.aspx?mid=762929&amp;only=1):
Автор: DarkGray
Дата: 13.08.04


DG>>Имхо, хорошая статическая типизация — это такая типизация, в которой можно по-максимуму задать ограничения на этапе компиляция.

DG>>Замечу, что текущие языки не умеют "работать" даже с базовыми вещами.
DG>>Пример 1:
DG>>Определить функцию, которая принимает объект, который должен поддерживать и интерфейс IA, и интерфейс IB.
DG>>Такое ограничение можно записать только с помощью generic-ов:
DG>>
DG>>void Method<T>(T value) where T:IA, IB {}
DG>>


Такое ограничение можно записать и проще и лучше:

void func( IA &ia, IB &id );

struct A : IA {};
struct AB : IA, IB {};

extern A a;
extern AB ab;

void test()
{
  func(a,a); // error
  func(ab,ab); // ok
}
Re[3]: К вопросу о "static typing" vs "dynamic typing"
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.04 13:43
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:

DG>>Как это будет восприниматься другими .Net-языков (например, C#-ом)?


SYG>Спросите у Sinclair, он сказал, что "Такое есть и в C#2." http://www.rsdn.ru/Forum/Message.aspx?mid=821943&amp;only=1
Автор: Sinclair
Дата: 23.09.04


http://gzip.rsdn.ru/article/csharp/newincsharp.xml
Автор(ы): Владислав Чистяков (VladD2)
Дата: 24.06.2004
В статье рассказывается о новшествах, которые должны появиться в новой версии языка C#

... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: К вопросу о "static typing" vs "dynamic typing"
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 27.09.04 06:09
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Неправда. Перечитай внимательно задачу.


На этот вопрос (про "C1 ИЛИ C2") я дал ответ еще в той ветке форума — это же самая обычная перегрузка.
PROCEDURE f(x: C1); OVERLOAD;
PROCEDURE f(x: C2); OVERLOAD;

VAR a: C1;
    b: C2;
BEGIN
  f(a); // f(x: C1);
  f(b); // f(x: C2);
Re[3]: К вопросу о "static typing" vs "dynamic typing"
От: Kluev  
Дата: 27.09.04 08:18
Оценка: :)
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>
SYG>PROCEDURE f(x: C1); OVERLOAD;
SYG>PROCEDURE f(x: C2); OVERLOAD;

SYG>VAR a: C1;
SYG>    b: C2;
SYG>BEGIN
SYG>  f(a); // f(x: C1);
SYG>  f(b); // f(x: C2);
SYG>


PROCEДУРА. Брр... Такой синтаксис выглядит как антиреклама.

Прочувствуйте разницу
void f(C1 x);
void f(C2 x);

коротко и ясно.
Re[4]: К вопросу о "static typing" vs "dynamic typing"
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 27.09.04 09:11
Оценка:
Здравствуйте, Kluev, Вы писали:

K>PROCEДУРА. Брр... Такой синтаксис выглядит как антиреклама.

K>Прочувствуйте разницу
K>
K>void f(C1 x);
K>void f(C2 x);
K>

K>коротко и ясно.

Чего же тут ясного-то? Вдумайтесь в то что Вы написали:
пустое место f(C1 x);
пустое место f(C2 x);

и сравните с тем что написано у меня
процедура f(x: C1); перегруженная
процедура f(x: C2); перегруженная
Re[5]: К вопросу о "static typing" vs "dynamic typing"
От: Kluev  
Дата: 27.09.04 09:44
Оценка: 1 (1) +1 -1 :))) :)
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Здравствуйте, Kluev, Вы писали:


SYG>Чего же тут ясного-то? Вдумайтесь в то что Вы написали:

SYG>
SYG>пустое место f(C1 x);
SYG>пустое место f(C2 x);
SYG>

После ознакомления с языком все ясно. И ничего лишнего.

SYG>и сравните с тем что написано у меня

SYG>
SYG>процедура f(x: C1); перегруженная
SYG>процедура f(x: C2); перегруженная
SYG>


А глазами сишного программера у вас написано
мусор f(x: C1); мусор
мусор f(x: C2); мусор
мусор a: C1;
      b: C2;
мусор
  f(a); // f(x: C1);
  f(b); // f(x: C2);
мусор
Re[6]: К вопросу о "static typing" vs "dynamic typing"
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 27.09.04 11:13
Оценка:
Здравствуйте, Kluev, Вы писали:

K>А глазами сишного программера у вас написано

K>
K>мусор f(x: C1); мусор
K>мусор f(x: C2); мусор
K>мусор a: C1;
K>      b: C2;
K>мусор
K>  f(a); // f(x: C1);
K>  f(b); // f(x: C2);
K>мусор
K>


Добрый Вы...
Re[7]: К вопросу о "static typing" vs "dynamic typing"
От: Kluev  
Дата: 28.09.04 07:19
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Здравствуйте, Kluev, Вы писали:


K>>А глазами сишного программера у вас написано

K>>
K>>мусор f(x: C1); мусор
K>>


SYG>Добрый Вы...


Да ладно, не относитесь серьезно. Это профессиональные заморочки. Наверное Оберон действительно хороший язык раз у него есть такие активные поклонники. А вообще о вкусах не спорят
Re[6]: К вопросу о "static typing" vs "dynamic typing"
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.10.04 21:05
Оценка:
Здравствуйте, Kluev, Вы писали:

K>А глазами сишного программера у вас написано


Видимо эти глаза перед данным процессом долго и с наслаждением выдирали.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: К вопросу о "static typing" vs "dynamic typing"
От: Schade Россия  
Дата: 28.10.04 13:55
Оценка: :)
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>На этот вопрос (про "C1 ИЛИ C2") я дал ответ еще в той ветке форума — это же самая обычная перегрузка.

SYG>
SYG>PROCEDURE f(x: C1); OVERLOAD;
SYG>PROCEDURE f(x: C2); OVERLOAD;

SYG>VAR a: C1;
SYG>    b: C2;
SYG>BEGIN
SYG>  f(a); // f(x: C1);
SYG>  f(b); // f(x: C2);
SYG>


Тогда откуда взялось вот это: Re[15]: Сложн
Автор: S.Yu.Gubanov
Дата: 01.09.04
утверждение компетентного человека по поводу наличия в Оберонах перегрузки функций?
... << RSDN@Home 1.1.4 @@subversion >>
Re[4]: К вопросу о "static typing" vs "dynamic typing"
От: Nick_ Россия  
Дата: 28.10.04 14:10
Оценка:
Здравствуйте, Schade, Вы писали:

S>Здравствуйте, S.Yu.Gubanov, Вы писали:


SYG>>На этот вопрос (про "C1 ИЛИ C2") я дал ответ еще в той ветке форума — это же самая обычная перегрузка.

SYG>>
SYG>>PROCEDURE f(x: C1); OVERLOAD;
SYG>>PROCEDURE f(x: C2); OVERLOAD;

SYG>>VAR a: C1;
SYG>>    b: C2;
SYG>>BEGIN
SYG>>  f(a); // f(x: C1);
SYG>>  f(b); // f(x: C2);
SYG>>


S>Тогда откуда взялось вот это: Re[15]: Сложн
Автор: S.Yu.Gubanov
Дата: 01.09.04
утверждение компетентного человека по поводу наличия в Оберонах перегрузки функций?


А с чего ты взял, что этот код на обероне, а не на модуле?
Re[4]: К вопросу о "static typing" vs "dynamic typing"
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 28.10.04 14:13
Оценка:
Здравствуйте, Schade, Вы писали:

S>Тогда откуда взялось вот это: Re[15]: Сложн
Автор: S.Yu.Gubanov
Дата: 01.09.04
утверждение компетентного человека по поводу наличия в Оберонах перегрузки функций?


А что, есть сомнения в том что в оберонах нет перегрузки функций? Почитайте Language Report-ы что ли для начала.
Re[5]: К вопросу о "static typing" vs "dynamic typing"
От: Schade Россия  
Дата: 28.10.04 14:44
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>А что, есть сомнения в том что в оберонах нет перегрузки функций?

Однако же был приведен аргумент:
PROCEDURE f(x: C1); OVERLOAD;
PROCEDURE f(x: C2); OVERLOAD;

без указания, что это не оберон
СГ>Почитайте Language Report-ы что ли для начала.
Это такая мягкая форма RTFM? Я, в общем-то, вопрос хотел задать.
... << RSDN@Home 1.1.4 @@subversion >>
Re[6]: К вопросу о "static typing" vs "dynamic typing"
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 28.10.04 14:47
Оценка:
Здравствуйте, Schade, Вы писали:

S>Однако же был приведен аргумент:

S>
S>PROCEDURE f(x: C1); OVERLOAD;
S>PROCEDURE f(x: C2); OVERLOAD;
S>

S>без указания, что это не оберон

Если написано OVERLOAD, то сразу видно что это не обероны.
Re[7]: К вопросу о "static typing" vs "dynamic typing"
От: Schade Россия  
Дата: 28.10.04 15:39
Оценка: 2 (2) +1
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Если написано OVERLOAD, то сразу видно что это не обероны.

[стеб]
Ну да. А если написано
__attribute__((dllexport))

то, разумеется, это GNU C++, а никак не Microsoft. Как, Вы не знали? Ну о чем говорить-то тогда? Почитайте-ка маны, что ли, для начала, избавьтесь от своей некомпетентности в столь важном вопросе.
[/стеб]
Я не помню, что бы я где-то утверждал, что легко отличаю один виртовский "шедевр" от другого. Но странно как-то в качестве еще одного аргумента в пользу "всемогущести" оберона приводить пример на модуле.

З.Ы. Вообще, серебряной пули нет. Не стоит ставить знак равенства между правильным проектированием и использованием оберона. Убогий и подрезанный со всех сторон язык не спасет от ламеризма. "Ударим по лабухам от программизма — отберем у них пошаговый отладчик". Замечательно, они будут трейсить в лог, ставить вместо брейкпойнтов дополнительные условия проверки — и все будет по-прежнему. И обероноподобный садизм (а как еще это можно назвать?) не поможет.
... << RSDN@Home 1.1.4 @@subversion >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.