На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (21) « Первая ... 19 20 [21]   ( Перейти к последнему сообщению )  
> ООП - в топку!
    Цитата korvin @
    Каким образом это может разруливаться в compile-time, если сообщение можно сформировать в runtime?
    Ну язык-то ститически типизирован. Там все известно в compile-time. Ну и кто вообще сказал, что методы должны быть разные? Пусть будет один единственный метод (например, send) принимающий строку. Все. Получай произвольные сообщения, и принимай решения в зависимости от этих сообщений. Напомню, что динамический тип данных - это суть алгебраический тип данных, который поддерживается очень многими статически типизированными языками, включая C++ (Boost.Variant) и D (std.variant).
    Цитата korvin @
    Это и есть отправка сообщения, а не вызов метода.
    По сути вызывается определенный метод-диспетчер, которому передается название вызываемого метода и его аргументы. То есть это все равно что вызвать dispatch(string name, string param). То есть в конечном итоге - это все равно вызов метода.
    Сообщение отредактировано: applegame -
    error: 'long long long' is too long for GCC
      Цитата applegame @
      Напомню, что динамический тип данных - это суть алгебраический тип данных

      Что ты имеешь в виду?
      "If someone claims to have the perfect programming language, he is either a fool or a salesman or both"(c) Bjarne Stroustrup
        Цитата D_KEY @
        Что ты имеешь в виду?

        Что именно тебе не понятно в этом предложении?
        error: 'long long long' is too long for GCC
          Цитата applegame @
          Цитата D_KEY @
          Что ты имеешь в виду?

          Что именно тебе не понятно в этом предложении?

          Просто это или неверно, или ты не раскрыл мысль.
          "If someone claims to have the perfect programming language, he is either a fool or a salesman or both"(c) Bjarne Stroustrup
            Цитата D_KEY @
            Просто это или неверно, или ты не раскрыл мысль.
            Что тут неверного? В любом динамически типизированном языке переменную можно представить как переменную алгебраического типа, состоящего из конечного числа типов поддерживаемых этим языком.
            Допустим в Erlang мы можем отправить сообщение, которое может иметь один из конечного числа типов. Аналогично, мы можем в том же D создать аналогичный алгебраический тип и передавать объекту сообщения этого типа (вся диспечеризация в рантайме):
            https://run.dlang.io/is/trH1nw
            Скрытый текст

            Зацените, насколько метапрограмминг в D мощнее и удобнее плюсового.
            ExpandedWrap disabled
              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 поверх обычных методов. :)
            Сообщение отредактировано: applegame -
            error: 'long long long' is too long for GCC
              Цитата applegame @
              В любом динамически типизированном языке переменную можно представить как переменную алгебраического типа, состоящего из конечного числа типов поддерживаемых этим языком.

              Эм. Нет. Тип может быть создан во время выполнения, например. Или типа вообще может не быть как сущности в языке(типа у нас есть только объекты).
              Не знаю, что ты подразумеваешь под алгебраическим типом данных, но я использую классическое определение - тип-сумма из типов-произведений, имеющая набор конструкторов, селекторов, частей и предикатов. А ты о чем?

              Добавлено
              Цитата applegame @
              Аналогично, мы можем в том же D создать аналогичный алгебраический тип и передавать объекту сообщения этого типа (вся диспечеризация в рантайме)

              Не понял, к чему тут твой пример? Где разные объекты и где разная реакция на разные сообщения, в том числе и неизвестные?
              "If someone claims to have the perfect programming language, he is either a fool or a salesman or both"(c) Bjarne Stroustrup
                Цитата D_KEY @
                Эм. Нет. Тип может быть создан во время выполнения, например. Или типа вообще может не быть как сущности в языке(типа у нас есть только объекты).
                Не знаю, что ты подразумеваешь под алгебраическим типом данных, но я использую классическое определение - тип-сумма из типов-произведений, имеющая набор конструкторов, селекторов, частей и предикатов. А ты о чем?
                Я рассуждаю в более узком смысле. Имеются в виду типы встроенные в язык. Допустим любая переменная в erlang имеет алгебраический тип состоящий из следующих типов: атом, функция, список, целое и так далее.
                Можно для облегчения взаимопонимания сузить термин "алгебраический тип" до "tagged union".

                Добавлено
                Цитата D_KEY @
                Не понял, к чему тут твой пример? Где разные объекты и где разная реакция на разные сообщения, в том числе и неизвестные?
                Объект foo, которому мы посылаем разные сообщения (в функции main) и он по разному реагирует на эти сообщения. Там по ссылке, в левом верхнем углу есть кнопка Run, покажет реакцию объекта на разные сообщения.
                Сообщение отредактировано: applegame -
                error: 'long long long' is too long for GCC
                  Цитата applegame @
                  Я рассуждаю в более узком смысле. Имеются в виду типы встроенные в язык. Допустим любая переменная в erlang имеет алгебраический тип состоящий из следующих типов: атом, функция, список, целое и так далее.

                  Мне кажется, тебя просто сбивает с толку pattern matching. Но фиг с ним.

                  Цитата
                  Объект foo, которому мы посылаем разные сообщения (в функции main) и он по разному реагирует на эти сообщения.

                  А где имена сообщений-то? Мы же про ООП говорим? Диспетчеризация не по имени разве должна быть?
                  Кстати, ты слышал про метод doesNotUnderstand в smalltalk?
                  "If someone claims to have the perfect programming language, he is either a fool or a salesman or both"(c) Bjarne Stroustrup
                    Цитата D_KEY @
                    Мне кажется, тебя просто сбивает с толку pattern matching. Но фиг с ним.
                    Причем тут pattern matching? Я о нем вообше не думал, замени erlang на JavaScript или PHP смысл не поменяется.
                    Цитата D_KEY @
                    А где имена сообщений-то? Мы же про ООП говорим? Диспетчеризация не по имени разве должна быть?
                    Ну добавь в сообщение строку с именем, будет тебе имя сообщения. Это не принципиально вообще. Даже в определении ООП Алана Кея, ЕМНИП, нет ничего об именах сообщений.
                    Сообщение отредактировано: applegame -
                    error: 'long long long' is too long for GCC
                      Цитата applegame @
                      Причем тут pattern matching? Я о нем вообше не думал, замени erlang на JavaScript или PHP смысл не поменяется.

                      Тогда я совсем не понимаю, при чем тут алгебраические типы данных :)

                      Цитата
                      Ну добавь в сообщение строку с именем, будет тебе имя сообщения. Это не принципиально вообще.

                      Так деспетчеризация же по имени идти должна, как не принципиально? Дальше идет поиск метода(сам объект/класс и далее по предкам). Нет?

                      Цитата
                      Даже в определении ООП Алана Кея, ЕМНИП, нет ничего об именах сообщений.

                      Так а что идентифицирует сообщение?
                      "If someone claims to have the perfect programming language, he is either a fool or a salesman or both"(c) Bjarne Stroustrup
                        Цитата D_KEY @
                        Тогда я совсем не понимаю, при чем тут алгебраические типы данных
                        Ладно, забей, так как у нас некие разногласия в вопросе имен сообщений.
                        Цитата D_KEY @
                        Так деспетчеризация же по имени идти должна, как не принципиально? Дальше идет поиск метода(сам объект/класс и далее по предкам). Нет?
                        В в SmallTalk так, да. Но как я понял это не обязательно.
                        Кстати, а можно ли в SmallTalk при отправке сообщения выбрать его имя динамически в рантайме? А то у меня закралось смутное сомнение, что нельзя :)
                        Цитата D_KEY @
                        Так а что идентифицирует сообщение?
                        Его содержимое, вестимо. Почему идентификатор сообщения не может быть его частью? Он не только может, он и есть часть сообщения. :)
                        Сообщение отредактировано: applegame -
                        error: 'long long long' is too long for GCC
                          Цитата D_KEY @
                          Так деспетчеризация же по имени идти должна, как не принципиально? Дальше идет поиск метода(сам объект/класс и далее по предкам). Нет?
                          В TurboVision у сообщений не было адресатов. Там все объекты объединялись в единую иерархию (это совсем не та иерархия, которая определяет отношения наследования), а события просто кидались в неё, и обрабатывал их тот, кто хотел. Может быть и никто. Может быть и многие.
                          Одни с годами умнеют, другие становятся старше.
                            Цитата Qraizer @
                            В TurboVision у сообщений не было адресатов.

                            Кстати да ... Я знаю, что уже давно ведется критика IP v.4 ... типа прямого соединения, бродкастов и мальтикастов недостаточно (или не так они реализованы). Ну екарный бабай!!!!1111 В языках а-ля более-менее высокого уровня - нет четкой позиции (сказать "парадигмы") и ее реализации - "А КАК ПРАВИЛЬНО". Как "более ВЫГОДНО по ресурсам, по скорости". Или я отстал от жысти?!
                            Мои программные ништякиhttp://majestio.info
                            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                            0 пользователей:
                            Страницы: (21) « Первая ... 19 20 [21] 


                            Рейтинг@Mail.ru
                            [ Script Execution time: 0,1820 ]   [ 14 queries used ]   [ Generated: 15.10.19, 18:55 GMT ]