На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 427 428 [429] 430 431 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата D_KEY @
    Почему ты забываешь о генерации кода?

    Генерация кода в рантайме? Но зачем, если проще диспетчеризовать в рантайме?

    Цитата D_KEY @
    a - тип.

    Нет, не тип. Это переменная.

    Цитата D_KEY @
    Нет, между этими не придется - он их вызовы сгенерирует сразу.

    Зачем? Если при длине списка > 3 все равно рано или поздно придется диспетчеризацию проводить. Или генерировать код постоянно при каждом обращении. Или он что, сгенерирует код для всех длин списков а потом будет просто его вызывать в зависимости от длины?

    Цитата D_KEY @
    Цитата
    У нас уже есть две перегрузки scalarProduct, которых достаточно для работы примера.

    Ага, оно и видно по твоему желанию генерировать типы в рантайме. Haskell этим не занимается. Насколько я знаю.

    Хаскелл рантаймом вообще не занимается. Но рантайм может этим заниматься. И чем это хуже генерации кода в рантайме? А ничего, что Cons<Cons<Cons<Cons<Nil>>>> и Cons<Cons<Cons<Nil>>> -- это разные типы? И что эти типы будут известны только в рантайме? Как компилятор при компиляции узнает, сколько раз нужно выполнить scalarProduct<Cons> 3 или 4?

    Цитата D_KEY @
    Ты не понимаешь разницы между типом во время компиляции и ссылкой на класс во время выполнения?

    Я не вижу разницы применительно к instanceof.

    Цитата D_KEY @
    Это было про дженерики, а не Haskell.

    Т.е. ты пытаешься применить принцип работы дженериков к тайпклассам? Ну-ну.

    Цитата D_KEY @
    ИМХО, ты путаешь с шаблонами. При параметрическом полиморфизме не нужно точно знать тип-параметр.

    Нет, я не путаю тайпклассы с шаблонами. Тайпклассы -- это не параметрический полиморфизм, а специальный. В приведенном хаскелльном коде вообще нет параметрического полиморфизма.

    Добавлено
    И да, даже для всех вызовов параметрически полиморфных функций в хаскелле все типы известны точно перед компиляцией (в исполняемую программы, а не в бинарный хаскельный модуль). Никаких типовых переменных не остается.
      Цитата korvin @
      Цитата D_KEY @
      Почему ты забываешь о генерации кода?

      Генерация кода в рантайме? Но зачем, если проще диспетчеризовать в рантайме?

      Да не в рантайме, а во время компиляции. Я тебе на низкоуровневых примитивах кодогенерации(шаблонах) показал, что может делать компилятор для создания корректного кода без создания типов в рантайме. Что не так-то?

      Добавлено
      Цитата korvin @
      Зачем? Если при длине списка > 3 все равно рано или поздно придется диспетчеризацию проводить. Или генерировать код постоянно при каждом обращении. Или он что, сгенерирует код для всех длин списков а потом будет просто его вызывать в зависимости от длины?

      Нет. Тебе не нужно знать длину при генерации кода. Тебе достаточно знать Nil у тебя там или Cons. А это ты знаешь.

      Цитата
      А ничего, что Cons<Cons<Cons<Cons<Nil>>>> и Cons<Cons<Cons<Nil>>> -- это разные типы?

      Да, это разные типы. Но с одним представлением. И на этапе выполнения тебе не нужно проводить между ними различия.

      Цитата
      Как компилятор при компиляции узнает, сколько раз нужно выполнить scalarProduct<Cons> 3 или 4?

      Попробуй понять тот мой код. Там все это есть.

      Цитата
      Т.е. ты пытаешься применить принцип работы дженериков к тайпклассам? Ну-ну.

      Я отвечал на вопрос про дженерики.

      Цитата
      Цитата D_KEY @
      ИМХО, ты путаешь с шаблонами. При параметрическом полиморфизме не нужно точно знать тип-параметр.

      Нет, я не путаю тайпклассы с шаблонами. Тайпклассы -- это не параметрический полиморфизм, а специальный. В приведенном хаскелльном коде вообще нет параметрического полиморфизма.

      Я не о тайпклассах, я о параметрическом полиморфизме в инстансе тайпкласса для Cons.

      Добавлено
      В общем, нужно на словах объяснить то, что я пытался объяснить тем псевдокодом.
        Цитата D_KEY @
        Да не в рантайме, а во время компиляции. Я тебе на низкоуровневых примитивах кодогенерации(шаблонах) показал, что может делать компилятор для создания корректного кода без создания типов в рантайме. Что не так-то?

        Окей, давай так: есть список (Cons 1 (Cons 2 (Cons 3 (Cons 4 Nil)))), полученный в рантайме от n=4. Какой код для него скомпилирует компилятор?

        Добавлено
        Цитата D_KEY @
        Нет. Тебе не нужно знать длину при генерации кода. Тебе достаточно знать Nil у тебя там или Cons. А это ты знаешь.

        лол, нет, не знаю, откуда? Длина заранее неизвестна, следовательно неизвестно, сколько нужно Cons'ов пройти, чтобы добраться до Nil'а.

        Добавлено
        Цитата D_KEY @
        Да, это разные типы. Но с одним представлением. И на этапе выполнения тебе не нужно проводить между ними различия.

        Да, не нужно, если scalarProduct ad-hoc полиморфна и может диспетчеризоваться в рантайме.

        Добавлено
        Цитата D_KEY @
        Я не о тайпклассах, я о параметрическом полиморфизме в инстансе тайпкласса для Cons.

        Там нет параметрического полиморфизма.

        Добавлено
        Цитата D_KEY @
        Попробуй понять тот мой код. Там все это есть.

        Попробуй понять, что я говорю. Напиши мне сгенерированый код для scalarProduct. В синтаксисе C++.
          Цитата korvin @
          Цитата D_KEY @
          Да не в рантайме, а во время компиляции. Я тебе на низкоуровневых примитивах кодогенерации(шаблонах) показал, что может делать компилятор для создания корректного кода без создания типов в рантайме. Что не так-то?

          Окей, давай так: есть список (Cons 1 (Cons 2 (Cons 3 (Cons 4 Nil)))), полученный в рантайме от n=4. Какой код для него скомпилирует компилятор?

          Позднее по шагам распишу кодогенерацию.

          Цитата
          Цитата D_KEY @
          Нет. Тебе не нужно знать длину при генерации кода. Тебе достаточно знать Nil у тебя там или Cons. А это ты знаешь.

          лол, нет, не знаю, откуда? Длина заранее неизвестна, следовательно неизвестно, сколько нужно Cons'ов пройти, чтобы добраться до Nil'а.

          Мы не на стадии выполнения находимся, а на стадии генерации кода компилятором.
          Тебе не нужно знать, сколько Cons'ов нужно пройти, тебе нужно сгенерировать две версии для инстанса с Cons - одну для Cons<Nil>, другую для Cons<любой другой тип>.


          Цитата
          Цитата D_KEY @
          Да, это разные типы. Но с одним представлением. И на этапе выполнения тебе не нужно проводить между ними различия.

          Да, не нужно, если scalarProduct ad-hoc полиморфна и может диспетчеризоваться в рантайме.

          Добавлено
          Цитата D_KEY @
          Я не о тайпклассах, я о параметрическом полиморфизме в инстансе тайпкласса для Cons.

          Там нет параметрического полиморфизма.

          :wall:

          Добавлено
          Цитата korvin @
          Попробуй понять, что я говорю. Напиши мне сгенерированый код для scalarProduct. В синтаксисе C++.

          На С++ без дженериков мне придется прибегнуть к void* или чему-то похожему - не хочу.
          Я тебе написал на дженериках+шаблонах. Раскрыть шаблоны?

          Добавлено
          Вот с раскрытыми шаблонами(надеюсь не опечатался нигде): Боюсь все-таки опечататься и запутать тебя еще больше.
          Сообщение отредактировано: D_KEY -
            Цитата D_KEY @
            Мы не на стадии выполнения находимся, а на стадии генерации кода компилятором.
            Тебе не нужно знать, сколько Cons'ов нужно пройти, тебе нужно сгенерировать две версии для инстанса с Cons - одну для Cons<Nil>, другую для Cons<любой другой тип>.

            А если типов, для которых инстанциирован ScalarProduct много, компилятор для всех сгенерирует код Cons<T>? Если нет, то чем Nil таким особенным выделился?
            Ну допустим у нас есть разный сгенерированный код для Cons<Nil> и Cons<другой тип>, на последней итерации test' scalarProduct вызывается для неизвестного ScalarProduct a. Дальше что?

            Добавлено
            Цитата D_KEY @
            :wall:

            Что тебя так удивляет?

            Добавлено
            Цитата D_KEY @
            На С++ без дженериков мне придется прибегнуть к void* или чему-то похожему - не хочу.
            Я тебе написал на дженериках+шаблонах. Раскрыть шаблоны?

            Без каких дженериков? Ты же говорил про сгенерированный машкод? Ну хорошо, не в C++, а в том псевдоязыке с шаблонами и дженериками.

            Добавлено
            Вот смотри, как это вижу я:
            ExpandedWrap disabled
              test' {T : Type} 0 _ (x : T) (y : T) = scalarProduct x y
              =>
              scalarProduct {T : Type} (x : T) (y : T) = (getInstance ScalarProduct T) x y
              где
              ScalarProduct.instances = Hash [ Nil => <code for Nil data> ; Cons => <code for Cons data> ]

            Вот теперь в том же духе, только в твоем любимом синтаксисе опиши, что происходит при вызове scalarProduct(x, y)

            Добавлено
            соответственно
            ExpandedWrap disabled
              <code for Nil> = lambda (x : Nil) (y : Nil) = 0
              <code for Cons> = lambda {T : Type} (x : Cons T) (y : Cons T) =
                  match x -> (cons i xt), y -> (cons j yt) in
                      i*j + scalarProduct {T} xt yt -- и опять выбор имплементации
            Сообщение отредактировано: korvin -
              Или я туплю сейчас, или действительно что-то не допонял тогда :) Так что может ты и прав.
              Да, такие вопросы у меня явно не получается обдумывать параллельно работе, в отличие от обычных...

              Добавлено
              Цитата korvin @
              Хаскелл рантаймом вообще не занимается.

              Если я ошибся и ты прав, то как этот код тогда работает?
                Цитата D_KEY @
                Если я ошибся и ты прав, то как этот код тогда работает?

                Ну поскольку это забота рантайма, то зависит от рантайма. Примерный алгоритм, каким он по-моему является, я описал, обычный typecase по меткам типов например (или меткам конструкторов). Кстаи Ocaml, afaik, в некоторых случаях вставляет метки типов в рантайм-значения. Вероятно он это делает только для экземпляров классов например. В Хаскелле же вероятно компилятор видит, что не может статически вывести полный тип аргументов scalarProduct и вставляет рантайм-проверку.
                Сообщение отредактировано: korvin -
                  Цитата korvin @
                  Цитата D_KEY @
                  Если я ошибся и ты прав, то как этот код тогда работает?

                  Ну поскольку это забота рантайма, то зависит от рантайма.
                  ...
                  В Хаскелле же вероятно компилятор видит, что не может статически вывести полный тип аргументов scalarProduct и вставляет рантайм-проверку.

                  Он же вроде никогда таким не занимается...
                    Цитата D_KEY @
                    Он же вроде никогда таким не занимается...

                    Сам не занимается, но "перекладывает ответственность" на рантайм.

                    Добавлено
                    Говорит типа: вот тут я фик знает какой конкретно тип, но для него есть инстанс ScalarProduct, так что ты, рантайм, сам там разберись, какой инстанс выбрать, я умываю руки.
                    Мавр сделал свое дело, мавр может уходить =)
                      Цитата korvin @
                      Цитата D_KEY @
                      Он же вроде никогда таким не занимается...

                      Сам не занимается, но "перекладывает ответственность" на рантайм.

                      Добавлено
                      Говорит типа: вот тут я фик знает какой конкретно тип, но для него есть инстанс ScalarProduct, так что ты, рантайм, сам там разберись, какой инстанс выбрать, я умываю руки.
                      Мавр сделал свое дело, мавр может уходить =)

                      Это я понял, но у меня пока нет уверенности, что тут требуется рантайм. Как назло интересная(для меня) задачка совпала с отсутствием времени :(
                        Цитата D_KEY @
                        Это я понял, но у меня пока нет уверенности, что тут требуется рантайм. Как назло интересная(для меня) задачка совпала с отсутствием времени :(

                        Ну я даже не знаю, какие еще аргументы привести. Попробуй, как будет время, описать алгоритм выполнения scalarProduct подобный моему, только без рантайма, тогда продолжим.
                        Сообщение отредактировано: korvin -
                          Цитата korvin @
                          Попробуй, как будет время

                          Ок.
                            D_KEY тут интересуется, можно ли на дельфях или шарпе написать такое? :)
                            ExpandedWrap disabled
                              #include "xsmell.hpp"
                              #include <iostream>
                               
                              TAG(html,  NO_ATTRIBS);
                              TAG(head,  NO_ATTRIBS);
                              TAG(title, NO_ATTRIBS);
                              TAG(body,  NO_ATTRIBS);
                              TAG(p,     NO_ATTRIBS);
                              TAG(a,     ATTRIB(href));
                              TAG(img,   ATTRIB(src), ATTRIB(alt));
                               
                              int main()
                              {
                                  using namespace xsmell;
                               
                                  document doc =
                                      _
                                      <html>_
                                          <head>_
                                              <title>"XSMELL demo"<!title>_
                                          <!head>_
                                          <body>_
                                              <p>"Yesssssssssssssssss!"<!p>_
                                              <img .src("chucknorris.png") .alt("sneezing eyes open")>_ <!img>_
                                          <!body>_
                                      <!html>
                                      _;
                               
                                  std::cout << doc << '\n';
                               
                                  return 0;
                              }
                              Цитата MyNameIsIgor @
                              D_KEY тут интересуется

                              :D
                                Цитата MyNameIsIgor @
                                D_KEY тут интересуется, можно ли на дельфях или шарпе написать такое?


                                Надеюсь что нет
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 427 428 [429] 430 431 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.6093 ]   [ 14 queries used ]   [ Generated: 29.07.26, 16:36 GMT ]