Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.48.212] |
|
Страницы: (21) « Первая ... 19 20 [21] ( Перейти к последнему сообщению ) |
Сообщ.
#301
,
|
|
|
Цитата korvin @ Ну язык-то ститически типизирован. Там все известно в compile-time. Ну и кто вообще сказал, что методы должны быть разные? Пусть будет один единственный метод (например, send) принимающий строку. Все. Получай произвольные сообщения, и принимай решения в зависимости от этих сообщений. Напомню, что динамический тип данных - это суть алгебраический тип данных, который поддерживается очень многими статически типизированными языками, включая C++ (Boost.Variant) и D (std.variant).Каким образом это может разруливаться в compile-time, если сообщение можно сформировать в runtime? По сути вызывается определенный метод-диспетчер, которому передается название вызываемого метода и его аргументы. То есть это все равно что вызвать dispatch(string name, string param). То есть в конечном итоге - это все равно вызов метода. |
Сообщ.
#302
,
|
|
|
Цитата applegame @ Напомню, что динамический тип данных - это суть алгебраический тип данных Что ты имеешь в виду? |
Сообщ.
#303
,
|
|
|
Цитата D_KEY @ Что ты имеешь в виду? Что именно тебе не понятно в этом предложении? |
Сообщ.
#304
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Что ты имеешь в виду? Что именно тебе не понятно в этом предложении? Просто это или неверно, или ты не раскрыл мысль. |
Сообщ.
#305
,
|
|
|
Цитата D_KEY @ Что тут неверного? В любом динамически типизированном языке переменную можно представить как переменную алгебраического типа, состоящего из конечного числа типов поддерживаемых этим языком.Просто это или неверно, или ты не раскрыл мысль. Допустим в Erlang мы можем отправить сообщение, которое может иметь один из конечного числа типов. Аналогично, мы можем в том же D создать аналогичный алгебраический тип и передавать объекту сообщения этого типа (вся диспечеризация в рантайме): https://run.dlang.io/is/trH1nw Скрытый текст Зацените, насколько метапрограмминг в D мощнее и удобнее плюсового. import std.stdio; import std.variant; alias Message = Algebraic!(string, int, This[]); auto send(T, M)(T obj, M message) { return obj.dispatch(Message(message)); } auto send(T, MS...)(T obj, MS messages) if(MS.length > 1) { Message[] msg; foreach(m; messages) msg ~= Message(m); obj.send(msg); } class Foo { void dispatch(Message msg) { msg.visit!( (string x) => writefln("string: %s", x), (int x) => writefln("integer: %s", x), x => writefln("unsupported: %s", x) ); } } void main() { Foo foo = new Foo; foo.send("hello"); foo.send(123); foo.send("hello", 123); } Правда, подозреваю, что korvin скажет, что я реализовал message-passing поверх обычных методов. |
Сообщ.
#306
,
|
|
|
Цитата applegame @ В любом динамически типизированном языке переменную можно представить как переменную алгебраического типа, состоящего из конечного числа типов поддерживаемых этим языком. Эм. Нет. Тип может быть создан во время выполнения, например. Или типа вообще может не быть как сущности в языке(типа у нас есть только объекты). Не знаю, что ты подразумеваешь под алгебраическим типом данных, но я использую классическое определение - тип-сумма из типов-произведений, имеющая набор конструкторов, селекторов, частей и предикатов. А ты о чем? Добавлено Цитата applegame @ Аналогично, мы можем в том же D создать аналогичный алгебраический тип и передавать объекту сообщения этого типа (вся диспечеризация в рантайме) Не понял, к чему тут твой пример? Где разные объекты и где разная реакция на разные сообщения, в том числе и неизвестные? |
Сообщ.
#307
,
|
|
|
Цитата D_KEY @ Я рассуждаю в более узком смысле. Имеются в виду типы встроенные в язык. Допустим любая переменная в erlang имеет алгебраический тип состоящий из следующих типов: атом, функция, список, целое и так далее.Эм. Нет. Тип может быть создан во время выполнения, например. Или типа вообще может не быть как сущности в языке(типа у нас есть только объекты). Не знаю, что ты подразумеваешь под алгебраическим типом данных, но я использую классическое определение - тип-сумма из типов-произведений, имеющая набор конструкторов, селекторов, частей и предикатов. А ты о чем? Можно для облегчения взаимопонимания сузить термин "алгебраический тип" до "tagged union". Добавлено Цитата D_KEY @ Объект foo, которому мы посылаем разные сообщения (в функции main) и он по разному реагирует на эти сообщения. Там по ссылке, в левом верхнем углу есть кнопка Run, покажет реакцию объекта на разные сообщения. Не понял, к чему тут твой пример? Где разные объекты и где разная реакция на разные сообщения, в том числе и неизвестные? |
Сообщ.
#308
,
|
|
|
Цитата applegame @ Я рассуждаю в более узком смысле. Имеются в виду типы встроенные в язык. Допустим любая переменная в erlang имеет алгебраический тип состоящий из следующих типов: атом, функция, список, целое и так далее. Мне кажется, тебя просто сбивает с толку pattern matching. Но фиг с ним. Цитата Объект foo, которому мы посылаем разные сообщения (в функции main) и он по разному реагирует на эти сообщения. А где имена сообщений-то? Мы же про ООП говорим? Диспетчеризация не по имени разве должна быть? Кстати, ты слышал про метод doesNotUnderstand в smalltalk? |
Сообщ.
#309
,
|
|
|
Цитата D_KEY @ Причем тут pattern matching? Я о нем вообше не думал, замени erlang на JavaScript или PHP смысл не поменяется.Мне кажется, тебя просто сбивает с толку pattern matching. Но фиг с ним. Цитата D_KEY @ Ну добавь в сообщение строку с именем, будет тебе имя сообщения. Это не принципиально вообще. Даже в определении ООП Алана Кея, ЕМНИП, нет ничего об именах сообщений. А где имена сообщений-то? Мы же про ООП говорим? Диспетчеризация не по имени разве должна быть? |
Сообщ.
#310
,
|
|
|
Цитата applegame @ Причем тут pattern matching? Я о нем вообше не думал, замени erlang на JavaScript или PHP смысл не поменяется. Тогда я совсем не понимаю, при чем тут алгебраические типы данных Цитата Ну добавь в сообщение строку с именем, будет тебе имя сообщения. Это не принципиально вообще. Так деспетчеризация же по имени идти должна, как не принципиально? Дальше идет поиск метода(сам объект/класс и далее по предкам). Нет? Цитата Даже в определении ООП Алана Кея, ЕМНИП, нет ничего об именах сообщений. Так а что идентифицирует сообщение? |
Сообщ.
#311
,
|
|
|
Цитата D_KEY @ Ладно, забей, так как у нас некие разногласия в вопросе имен сообщений.Тогда я совсем не понимаю, при чем тут алгебраические типы данных Цитата D_KEY @ В в SmallTalk так, да. Но как я понял это не обязательно.Так деспетчеризация же по имени идти должна, как не принципиально? Дальше идет поиск метода(сам объект/класс и далее по предкам). Нет? Кстати, а можно ли в SmallTalk при отправке сообщения выбрать его имя динамически в рантайме? А то у меня закралось смутное сомнение, что нельзя Цитата D_KEY @ Его содержимое, вестимо. Почему идентификатор сообщения не может быть его частью? Он не только может, он и есть часть сообщения. Так а что идентифицирует сообщение? |
Сообщ.
#312
,
|
|
|
Цитата D_KEY @ В TurboVision у сообщений не было адресатов. Там все объекты объединялись в единую иерархию (это совсем не та иерархия, которая определяет отношения наследования), а события просто кидались в неё, и обрабатывал их тот, кто хотел. Может быть и никто. Может быть и многие. Так деспетчеризация же по имени идти должна, как не принципиально? Дальше идет поиск метода(сам объект/класс и далее по предкам). Нет? |
Сообщ.
#313
,
|
|
|
Цитата Qraizer @ В TurboVision у сообщений не было адресатов. Кстати да ... Я знаю, что уже давно ведется критика IP v.4 ... типа прямого соединения, бродкастов и мальтикастов недостаточно (или не так они реализованы). Ну екарный бабай!!!!1111 В языках а-ля более-менее высокого уровня - нет четкой позиции (сказать "парадигмы") и ее реализации - "А КАК ПРАВИЛЬНО". Как "более ВЫГОДНО по ресурсам, по скорости". Или я отстал от жысти?! |