Re[39]: Являются ли макросы свидетельством недостаточной выр
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.08.07 00:41
Оценка:
Здравствуйте, Kisloid, Вы писали:

K>>Слово "затруднительно" не имеет объективного значения. Я думаю, что на Nemerle можно писать, не пользуясь макросами. Но зачем?


K>А я вот по другому думаю, зачем пользоваться макросами, если не понимаешь зачем их надо использовать, в Немерле можно писать вообще не имея представления о том, что такое макрос.


Дык при этом ты будешь постоянно пользоваться ими. Просто не будешь понимать этого. Тот же if или while — это макросы. Писать без них несомненно можно. Но, как верно заметил Klapaucius, зачем?!
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: Являются ли макросы свидетельством недостаточной выр
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.08.07 00:41
Оценка:
Здравствуйте, EvilChild, Вы писали:

EC>Я правильно понимаю, что для того, чтобы понять что делает макрос нужно довольно подробно представлять как устроено AST,

EC>какие есть фазы компиляции, как AST может трансформироваться на каждой из них?

Да несомненно. Это один из спосбов узнать что делает макрос. Хорошим примером тут является макрос foreach. Вот его код:
  /**
   * The 'foreach' macro introduces a construction equivalent
   * to C#'s 'foreach' keyword, iterating over a collection.
   */
  macro @foreach (inexpr, body)
  syntax ("foreach", "(", inexpr, ")", body)
  {
    match (ListComprehensionHelper.ExpandRange (inexpr, body)) {
      | Some (expr) => Nemerle.Imperative.Return (expr)
      | None => {}
    }

    def (iter, collection) =
      match (inexpr) {
        | <[ $i in $c ]> => (i, c)
        | e =>
          Message.FatalError ($ "the syntax is 'foreach (x in collection)', "
                                "got $e");
      }
      
    def typer = Macros.ImplicitCTX ();
    def tcollection = typer.TypeExpr (collection);

    // build the body of loop (may contain additional matching)
    def build_definition (val) {
      match (body) {
        | <[ match ($(null)) { ..$cases } ]> =>
          match (iter) {
            | <[ $(x : name) ]> when char.IsLower (x.Id[0]) | <[ (..$_) ]> => ()
            | _ => Message.FatalError ("only simple names available in pattern"
                                       " of foreach with direct matching")
          }

          <[ def $iter = $val; 
             match ($iter) { ..$cases } 
          ]>

        | _ =>
          def mat =
            match (iter) {
              | <[ $pat :> $ty ]> =>
                <[ match ($val :> $ty) { | $pat => $body; () | _ => () } ]>
              | _ =>
                <[ match ($val) { | $iter => $body; () | _ => () } ]>  
            }
          mat.cases.Iter (fun (x : PT.MatchCase) { x.disable_warnings = true });
          mat
      }
    }

    // here we choose if we want to use enumerator pattern
    // of access GetEnumerator through IEnumarable
    // http://www.jaggersoft.com/csharp_standard/15.8.4.htm
    def decide_enumerator_pattern (tyinfo) {
      def all = tyinfo.LookupMember ("GetEnumerator");
      
      def choosen = List.Exists (all, fun (mem : IMember) {
        | meth is IMethod when !meth.IsStatic && meth.GetParameters ().IsEmpty =>
          match (meth.ReturnType.Fix ()) {
            // FIXME: do additional conservative checks              
            | MType.Class (tc, _) when
              !tc.LookupMember ("MoveNext").IsEmpty &&
              !tc.LookupMember ("Current").IsEmpty => true
              
            | _ => false
          }
        | _ => false
      });
      if (choosen)
        <[ $(tcollection : typed).GetEnumerator () ]>
      else
        <[ ($(tcollection : typed) : System.Collections.IEnumerable).GetEnumerator () ]>
    }

    typer.DelayMacro (fun (fail_loudly) {
      match (tcollection.Type.Hint) {
        | Some (MType.Class (tc, args)) =>
          if (tc.InternalType.Nemerle_list_tc != null 
              && tc.SuperType (tc.InternalType.Nemerle_list_tc).IsSome)
          {
            def arg = List.Head (args);
            def definition = build_definition (<[ x ]>);
            Some (<[
              // we explicitly set parameter type to list, because collection's type
              // can be more specific (list.Cons, etc.)
              ($("_N_break" : global) : {
                def foreach_loop (_ : list [$(arg : typed)]) {
                  | x :: xs =>
                    $("_N_continue" : global) : {
                      $definition;
                    }
                    foreach_loop (xs)
                  | _ => ()
                }
                foreach_loop ($(tcollection : typed))
              })
            ]>)
          }
          else {
            def init_body = decide_enumerator_pattern (tc);

            def is_disposable = 
              typer.JustTry (fun () {
                def expr = typer.TypeExpr (init_body);
                expr.Type.Require (<[ ttype: System.IDisposable ]>)
              });

            def finally_body = 
              if (is_disposable)
                <[ (enumerator : System.IDisposable).Dispose () ]>
              else
                <[
                  match (enumerator) {
                    | x is System.IDisposable => x.Dispose ();
                    | _ => ()
                  }
                ]>;

            def definition = build_definition (<[ enumerator.Current ]>);

            Some (<[ 
              def enumerator = $init_body;
              $("_N_break" : global) : {
                def loop () {
                  when (enumerator.MoveNext ()) {
                    $("_N_continue" : global) : {
                      $definition;
                    }
                    loop ();
                  }
                }
                try { loop () } 
                finally { $finally_body }
              }
            ]>)
          }

        | Some (MType.Array (_ , rank)) =>
          def indices  = array (rank);
          def lengths = array (rank);
          for (mutable i = 0; i < rank; ++i) {
            indices [i] = Macros.NewSymbol ();
            lengths [i] = Macros.NewSymbol ();
          }
          def indices_list = List.RevMap (List.FromArray (indices), fun (x) {
              <[ $(x : name) ]> 
          });
          def build_loops (depth)  {
            /// build expression defining iteration symbols
            | 0 => build_definition ( <[ cached_collection [..$indices_list] ]> )
            | n => 
              def idx = indices [n - 1];
              <[ for (mutable $(idx : name) = 0; 
                      $(idx : name) < $(lengths [n - 1] : name);
                      ++ $(idx : name) ) 
                   $(build_loops (n - 1)) 
              ]>
          }
          mutable sequence = [ <[ $(build_loops (rank)) ]> ];
          if (rank == 1) 
            sequence = <[ def $(lengths [0] : name) = cached_collection.Length ]> :: sequence;
          else
            for (mutable i = rank - 1; i >= 0; --i)
              sequence = <[ def $(lengths [(rank - 1) - i] : name) = cached_collection.GetLength ($(i : int)) ]>
                         :: sequence;

          sequence = <[ def cached_collection = $(tcollection : typed) ]> :: sequence;
          Some (<[ { .. $sequence } ]>)

        | t =>
          when (fail_loudly) {
            def guess =
              match (t) {
                | Some (t) => $ "current best guess about the type is $t"
                | None => "the compiler has no idea what the type might be"
              }
            Message.Error ($ "collection in foreach must be an array or "
                             "type implementing enumerator pattern, $guess");
            Message.Hint ("try specifing the type directly using 'expr : SomeType'");
          }
          None ()
      }
    })
  }


Мне кажется этот код очевиден. Но есть и другой, более сложный, на мой взгляд, способ познания того что же делает макрос — это прочтение документации или коментариев. Например,
foreach можно описать как аналог foreach из C# 2.0 который кроме всего прочего позволет фильтровать данные с помощь паттерн-матчинга.

EC>Т.е. при применении макроса с моим кодом может произойти практически любая трансформация?


Ага.

EC>Потому как я применяя yield return точно знаю, что сделает компилятор и как это всё локализовано.


На саомо деле ты не знашь что делает код отвечающий за реализацию yield return. Это гора С++-кода которую ты скорее всего даже не сможешь понять если увидишь. Но тебе спокойно так как индус писавший ее работает в МС.

В прочем, когда люди пишут на С++ или на Шарпе с применением небезопасного кода или интеропа, то с их кодом может произойти вообще все что угодно, так как от проходов по памяти их мало что защищает. Но это не останавливает почти никого.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[44]: Являются ли макросы свидетельством недостаточной выр
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.08.07 00:41
Оценка:
Здравствуйте, AndrewVK, Вы писали:

L>>Это не понял. Пример?


AVK>Кодогенерация при деплойменте.


И првда. Ведь запустить при развертывании генератор кода и потом компилятор C# — это в порядке вещей. А запустить скажем компилятор Немерле или интерпретатор Лиспа — это фу бяка ату эту идею.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[46]: Являются ли макросы свидетельством недостаточной выр
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.08.07 00:41
Оценка:
Здравствуйте, mkizub, Вы писали:

M>это императивщина, поскольку последовательность операций.

M>Процедурный подход безусловно мощнее, поскольку декларативный ограничен набором известных ему операций.

Серьезно? Ну, когда ты на своем более мощьном подходе повторишь возможности и качество кода обеспечиваемые макросом foreach, то мы с тобой осбудим приемущество твоего подхода. А пока ивини, но я склонен думать, что ты говорить о том, что не понимаешь.

M> Но он же и более тяжёлый в написании и понимании.


Вот это правада. Особенно тежело думать в терминах лэйблов и готу.

M> Что-то более сложное на нём практически невозможно изобразить. Мне кажется, компилятор должен иметь оба этих интерфейса к преобразованию AST, точнее — декларативный можно изобразить как некий плагин к компилятору (если понимать под плагином некий пользовательский код, который делает трансформацию AST), тогда в компилятор можно вставить несколько разных систем описания трансформации (используя квотинг, или как это описывается в AOP, или это будет некий embedded DSL вроде logic engine в SymADE и так далее).



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

Да... Что до обхода АСТ и т.п., то лучше бы ты взял язык с паттерн-матчингом и алгеброическими типами. Тода и тонн кода генерировать не пришлось бы. Так что это скорее пример в пользу автора темы.

M>Блин, это RSDN, который не меняет URL при клике на другой пост

M>http://rsdn.ru/forum/message/2610368.1.aspx
Автор: mkizub
Дата: 05.08.07
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[36]: Являются ли макросы свидетельством недостаточной выр
От: EvilChild Ниоткуда  
Дата: 13.08.07 03:41
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Мне кажется этот код очевиден.

Он более менее понятен, даже учитывая, что я не знаю Nemerle, но никак не очевиден.
Видимо у меня парадигматический сдвиг ещё не произошёл

Я бы ещё заменил "collection in foreach must be an array or type implementing enumerator pattern" на
"collection in foreach must be an array or type implementing IEnumerable/IEnumerable<>"
потому как enumerator pattern как-то мутно звучит.

VD>На саомо деле ты не знашь что делает код отвечающий за реализацию yield return. Это гора С++-кода которую ты скорее всего даже не сможешь понять если увидишь. Но тебе спокойно так как индус писавший ее работает в МС.

Это тупо код на C# (хотя во что декомпилируешь), причём довольно примитивный в простых случаях.
Единственная сложность в понимании это кривые генерённые имена.

VD>В прочем, когда люди пишут на С++ или на Шарпе с применением небезопасного кода или интеропа, то с их кодом может произойти вообще все что угодно, так как от проходов по памяти их мало что защищает. Но это не останавливает почти никого.

Работа с памятью это проблема из совершенно другой плоскости.
now playing: Marc Antona — Fast Cats No Fat
Re[29]: Являются ли макросы свидетельством недостаточной выр
От: Andrei F.  
Дата: 13.08.07 04:59
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Маловато будет, тут по большей части просто процессоры IL, Феникс вообще пока умер. Есть еще RAILS — но они тоже как-то присмерти.


Почему умер? Последний RDK вроде за март этого года.
А что за RAILS?
Re[40]: Являются ли макросы свидетельством недостаточной выр
От: Andrei F.  
Дата: 13.08.07 05:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Что же касается текста, то очень многие продукты использовавшие ранее бинарные форматы (МС Офис, Опен Офис) стримительно движутся к текстовым форматам (на базе стандартного ХМЛ-я). Правда есть над чем задуматься?


Действительно, есть над чем задуматься. Если API для доступа к хранилищу данных нормально проработано, то для разработчика нет вообще никакой разницы, что конкретно используется как конечное хранилище — текст или бинарная форма. Ну за исключением такой мелочи как производительность, конечно

Так что если они решили отказаться от STG и переходить на текстовый формат, то тут есть несколько возможных причин:
1. Следование моде
2. Разработчики команды STG положили большой болт на просьбы команд, которые пользуются их творением, и теперь тем приходится как-то выкручиваться
3. Нужно как-то использовать все эти огроменные мегагерцы и гигабайты, которые нагло выдают разработчики железа

А вообще самый правильный подход используют разработчики PNG (если не ошибаюсь). Там все данные хранятся в бинарной форме (естественно), но при желании поковыряться внутри можно сделать экспорт в текстовую форму.
Re[35]: Являются ли макросы свидетельством недостаточной выр
От: cl-user  
Дата: 13.08.07 07:11
Оценка:
Здравствуйте, VladD2, Вы писали:

G>> К примеру, макросистема в любом чисто динамическом языке...


VD>Хароший пример . Кстати, о Лиспе. Мне тут показывали как на Лиспе из макросов в рантайме типы вытаскивали и код на ходу генерили и исполняли. 10-и этажный наворот! И все потому, что язык динамический, а типы для решения задачи ой как хочется иметь.


G>> без аннотаций типов этой информации получить не может в принципе.


VD>О как? А не ты ли мне про вывод типов в ОКамле рассказывал?


"О птичках"...

Я уже упоминал здесь Qi — предлагаю тем, кому это действительно может быть интересно. Это библиотека для CL, которая добавляет к "динамическому языку" и частичный вывод типов, и строгую типизацию, и паттерн-матчинг и многое другое. Естественно, что это уже получается не совсем "лисп", но! — одновременная работа и с чистым CL и с Qi возможна. Учитывая возможность в лиспе "горячей подмены" ридера — это не удивительно. Естественно, макросы там используются "в полный рост".

Конечно-же не "без минусов": учитывая врождённую динамику лиспа это всё даётся некоторой потерей производительности (но, хочу заметить, не большой, а учитывая хорошее качество двоичного кода, который генерит тот-же sbcl, на потери и вовсе можно не обращать внимания).
Re[36]: Являются ли макросы свидетельством недостаточной выр
От: cl-user  
Дата: 13.08.07 07:26
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Главное, что есть в макросах — это потрясаующе простая и удобная система их разработки. Квази-цитирование, паттерн-матчинг, атрибуты и некоторые другие решения позволяют писать макросы тем кто не толко ничего не понимает в мсил-е, но и мало что понимает в компиляторах.


Влад, для многих здесь присутствующих это не "плюс", а "тяжкий смертный грех"

P.S. Само собой — я не о себе
Re[37]: Являются ли макросы свидетельством недостаточной выр
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.08.07 07:39
Оценка:
Здравствуйте, EvilChild, Вы писали:
EC>Я бы ещё заменил "collection in foreach must be an array or type implementing enumerator pattern" на
EC>"collection in foreach must be an array or type implementing IEnumerable/IEnumerable<>"
EC>потому как enumerator pattern как-то мутно звучит.
Ну, в дотнетном мире Enumerator Pattern — это имя собственное. Я бы это подчеркнул в комментах капитализацией. А вот заменять всякий раз определяемое на определение, тем более в комментариях к исходникам — увольте. В очередной раз процитирую:

Поразмыслив над этим, я решил было вовсе изгнать все морские термины из своего лексикона, заменив их теми словами, которые с давних пор существуют в обычном нашем живом языке.

Результат, однако, получился весьма нежелательный: первая же лекция, прочитанная мною в соответствии с принятым решением, доставила много ненужных огорчений как мне, так и моим слушателям.

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

... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[36]: Являются ли макросы свидетельством недостаточной выр
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 13.08.07 08:23
Оценка: +2
Здравствуйте, VladD2, Вы писали:

VD>Мне кажется этот код очевиден.


"Очевидный" это когда пара строчек. А когда три экрана текста, которые нельзя охватить взглядом, то слово "очевидный" уже не в кассу.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[40]: Являются ли макросы свидетельством недостаточной выр
От: Kisloid Мухосранск  
Дата: 13.08.07 09:02
Оценка:
Здравствуйте, VladD2, Вы писали:

K>>А я вот по другому думаю, зачем пользоваться макросами, если не понимаешь зачем их надо использовать, в Немерле можно писать вообще не имея представления о том, что такое макрос.


VD>Дык при этом ты будешь постоянно пользоваться ими. Просто не будешь понимать этого. Тот же if или while — это макросы. Писать без них несомненно можно. Но, как верно заметил Klapaucius, зачем?!


Да, я просто не совсем правильно выразился, конечно я имел ввиду под "пользоваться" написание макросов.
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
Re[38]: Являются ли макросы свидетельством недостаточной выр
От: mkizub Литва http://symade.tigris.org
Дата: 13.08.07 09:36
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>в статических языках тип переменной определяется текстом программы, в динамических — процессом исполнения. кстати ООП — это динамическая типизация, даже когда она привнесена в статические языки


Нет, ООП не противоречит статической типизации. Тип — это набор констрайнтов, определяющих что можно сделать с объектом. Тип в Java ничем не хуже типа в C, это всё тот-же набор операций над объектом.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[47]: Являются ли макросы свидетельством недостаточной выр
От: mkizub Литва http://symade.tigris.org
Дата: 13.08.07 09:53
Оценка: :))
Здравствуйте, VladD2, Вы писали:

VD>Серьезно? Ну, когда ты на своем более мощьном подходе повторишь возможности и качество кода обеспечиваемые макросом foreach, то мы с тобой осбудим приемущество твоего подхода. А пока ивини, но я склонен думать, что ты говорить о том, что не понимаешь.


Он у меня давно есть, и работает на славу.
Но я не об этом. Я случайно увидел твой ответ, обычно я сообщения от тебя просто пропускаю — ты в игноре.
Спасибо за понимание.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[41]: Являются ли макросы свидетельством недостаточной выр
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.08.07 11:22
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>С каких пор SQL динамически типизированный?


С таких. Во-первых CASE может возвращать разнотипные значения в зависимости от условия, во-вторых типы параметров указываются только в момент выполнения запросов.
... << RSDN@Home 1.2.0 alpha rev. 710 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[45]: Являются ли макросы свидетельством недостаточной выр
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.08.07 11:22
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>И првда. Ведь запустить при развертывании генератор кода и потом компилятор C# — это в порядке вещей. А запустить скажем компилятор Немерле или интерпретатор Лиспа — это фу бяка ату эту идею.


Да запустить то не проблема. Проблема в том, что бизнес-сущности на момент деплоймента уже скомпилированы. И чем при таком раскладе помогут макросы мне пока неясно. Упростят код генерируемых проксей? Так они и так примитивны как 3 копейки. Что то еще?
... << RSDN@Home 1.2.0 alpha rev. 710 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[37]: Являются ли макросы свидетельством недостаточной выр
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.08.07 11:22
Оценка:
Здравствуйте, EvilChild, Вы писали:

EC>Я бы ещё заменил "collection in foreach must be an array or type implementing enumerator pattern" на

EC>"collection in foreach must be an array or type implementing IEnumerable/IEnumerable<>"

enumerator pattern это несколько большее, нежели просто реализация IEnumerable/IEnumerable<T>
... << RSDN@Home 1.2.0 alpha rev. 710 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[28]: Являются ли макросы свидетельством недостаточной выр
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.08.07 11:22
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Они присуствуют, но в сильно извращенной форме. И далеко не в самых удобных языках.


Однако ж даже в извращенной форме они присутствуют куда в большем объеме, нежели их идеальная реализация в Nemerle.
... << RSDN@Home 1.2.0 alpha rev. 710 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[34]: Являются ли макросы свидетельством недостаточной выр
От: Andir Россия
Дата: 13.08.07 13:07
Оценка:
Здравствуйте, IT, Вы писали:

BZ>>от тебя больше 10 сооющений и все датированы 23:58. помогают навыки профессиональной машинистки?


Булат похоже просто не в курсе, что Янус сообщения скопом отправляет, а не по мере написания

С Уважением, Andir!
using( RSDN@Home 1.2.0 alpha rev. 703 ) { /* Работаем */ }
Re[38]: Являются ли макросы свидетельством недостаточной выр
От: EvilChild Ниоткуда  
Дата: 13.08.07 17:20
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>enumerator pattern это несколько большее, нежели просто реализация IEnumerable/IEnumerable<T>

Насколько мне известно для foreach необходима и достаточна реализация одного из этих интерфейсов.
Или что-то ещё в этот паттерн включается?
now playing: Deep-Dive-Corp — Walker (Ohm-G Rmx)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.