Weak typing

Sep 02, 2008 09:12

У кого-нибудь есть идеи, как можно на шарпе промоделировать weak typing ( Read more... )

техно

Leave a comment

Comments 22

skalych September 2 2008, 05:31:22 UTC
в строке храни, если числа имеешь в виду ) эксепшен и будет при преобразовании
(если правельно понял вопрос)

Reply

grandmag September 2 2008, 06:03:34 UTC
не совсем понятно, как преобразовывать

Reply

skalych September 2 2008, 06:23:39 UTC
String sum (String arg1, arg2)
{
try
{
return ""+(int.Parse(arg1)+int.Parse(arg2));
}
catch (DunnoWhichException e) {}

try
{
return ""+(float.Parse(arg1)+float.Parse(arg2));
}
catch (DunnoWhichException e) {}

return arg1+arg2;
}

Reply


gaus September 2 2008, 05:35:46 UTC
Гугл по запросу duck typing using Java выдает много интересного.
Hope that helps.

Reply

grandmag September 2 2008, 06:01:23 UTC
да, это близко
но к операции сложения такое, по-моему, применить нельзя...

Reply

gaus September 2 2008, 06:04:59 UTC
Почему нельзя? Сначала анбоксинг встроенного типа, а потом рефлекшеном изучаем методы, которые у него есть.

Reply

van_appel September 2 2008, 06:09:25 UTC
По моему тоже можно, но там лучше экспериментальным путем посмотреть, в какой метод отображается операция сложения.

Reply


van_appel September 2 2008, 05:42:49 UTC
Рефлекшены подойдут?

Reply

grandmag September 2 2008, 05:57:49 UTC
Вот смотри. Есть два объекта
object a, object b

Хочу просто вернуть сумму, когда это возможно
return a+b;

А в шарпе получится, что надо как-то гиморно вроде:
typea = a.Type;
typeb = b.Type;

if(typea == typeb){

if(typea == typeof(int)){
return (int)a + (int)b;
}
if(typea == typeof(double)){
return (double)a + (double)b;
}

...

}

Reply

van_appel September 2 2008, 06:07:48 UTC
Ну вот. Через рефлекшены посмотреть, есть ли у объекта a метод add(b.Type), если есть - то получить экземпляр метода и вызвать его с параметрами a и b.

В Java это вполне легитимная практика, так что и в .NET должно быть нечто подобное.

Reply

gaus September 2 2008, 06:10:41 UTC
Любую задачу можно решить введением нового уровня абстрации :) в данном случае это паттерн Прокси. Оберни object новым типов DuckObject и перегрузи у него операторы.

Хотя, если cишарп уже поддерживает темную магию метапрограммирования, то будет совсем хорошо :)

Reply


elder_george September 2 2008, 13:59:29 UTC
0) а точно дженериков не хватит (с этого надо было начать, anyway)?
1) генерация прокси. См., например, DynamicProxy в CastleProject или LinFu.
2) Извраты с рефлекшеном/expression trees (см. мой недавний облажанный пост =) в качестве демонстрации идеи).
Типа
Expression> e = (a,b) => a + b;
где INum - некий тип, поддерживающий нужные операции (+, -, ...)
Потом проходишься по дереву визитором (в MSDN есть статья) и строишь эквивалентное дерево, где INum заменен на нужный тебе тип, а абстрактные операции - на нужные тебе.
3) почему нельзя подключить язык с динамической типизацией? JScript (obsolete, но все же), Boo, IronPython, IronRuby?

Это то, что на ум приходит.

Reply

grandmag September 2 2008, 17:52:35 UTC
0) дженерики же тоже компайл-тайм, как ты в рантайме их прикрутишь? возможно, через рефлекшен, но через рефлекшен есть более очевидные пути, которых как раз хочется избежать (ну то есть так уже реализовано почти, ищу альтернативы)
1) прокси да, уже прикручиваю... сделал WeakTypedObject прокси -- типа, объект, который оборачивает object, перегружает все мыслимые операторы и бросает эксепшен, если обернутый тип не поддерживает -- но есть свои минусы, всё равно в итоге всё сводится к преобразованию внутреннего object в разные встроенные типы
2) да, что-то такое и реализовано... дай точную ссылку на пост, а то я не помню когда это было :-)
3) вероятно, сложности с поддержкой кода потом :-)

Reply

elder_george September 2 2008, 18:12:42 UTC
1) А ты уверен, что тебе таки реально нужна динамическая типизация, а не какая-то иная возможность построения обобщённых алгоритмов? Может, их проще описать просто в более-менее отвлеченном от конкретных типов варианте, возложив специфику вычисления тех или иных значений на стратегии, а конкретные типы все равно подставятся уже в рантайме?
2) http://georgeelder.blogspot.com/2008/08/c-expression-trees.html - показано, как их строить ручками, хотя там пример другой. Однако можно возложить на компилятор.
про модификацию - см. тут (или ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/dv_fxadvance/html/2c9001bb-6422-4a85-80c1-c587df45d9ab.htm в хелпе к VS 2008). В твоем случае нужно будет заменить типы аргументов, а также MethodInfo для методов-операторов. В общем, гимор тот же, но есть возможность возложить синтаксис на компилятор и проверить ошибки все разом, в момент компиляции дерева выражения, а не при обращении к каждому конкретному методу ( ... )

Reply

grandmag September 2 2008, 18:53:16 UTC
1) там могут быть инты, даблы, стринги и сложно сказать, что еще... всё равно получается НОД -- object

Reply


marsiaanin September 3 2008, 05:27:01 UTC
А если сделать кодогенератор, который будет для всех стандартных типов, имеющих нужную операцию, генерировать метод. Конечно, это не совсем Runtime, но, кажется, можно и динамически генерировать код

Reply

grandmag September 3 2008, 05:53:51 UTC
вот это интересно, может пригодиться! :-)

Reply

marsiaanin September 4 2008, 05:22:42 UTC
Кажется Юра делал какой-то код и кодогенератором, и динамически. Его поспрошай. Мне это тоже интересно, но слышал про эти два подхода я именно от него.

Reply


Leave a comment

Up