вторник, 21 января 2014 г.

Коротко. Для "совсем знающих". Переделываю "криптованный язык"...

Перемыл тут "шаблоны кодогенерации".

Из:

 <%CX>

Получил:

 for 'C' |==>
 begin
  OBJECT IN %C
  %C ExecuteGenerator
 end; // for

Многословно..

Но!

"Это ещё не вечер"...

Update: 

А в итоге получилось вот что:

 for Self.Children
 begin
  OBJECT IN aChild
  aChild .ExecuteGenerator
 end; // for

или

 for .Children
 begin
  OBJECT IN aChild
  aChild .ExecuteGenerator
 end; // for

Ну и в итоге рекурсивно:

 for .Children
 begin
  OBJECT IN aChild
  for .Children
  begin
   OBJECT IN aChild
   aChild .ExecuteGenerator
  end; // for
  aChild .ExecuteGenerator
 end; // for

-- .Children - оно "контекстно зависимое", от "первого параметра вызывающего слова", ну как от Self или this.

!!! Я бы конечно не стал бы морочиться с подобной "контекстной зависимостью", тем более, что "дураку" она понимания не добавляет.

Но к сожалению её "пронизан" ИСХОДНЫЙ "криптованный язык".

И АВТОМАТОМ перемыть шаблоны БЕЗ ЕЁ выкидывания - не получилось.

Но "руками" код УЖЕ можно писать и БЕЗ "контекстной зависимости".

Вот так:

 for Self.Children
 begin
  OBJECT IN aChild
  for aChild.Children
  begin
   OBJECT IN aChild
   aChild .ExecuteGenerator
  end; // for
  aChild .ExecuteGenerator
 end; // for
В идеале конечно хотелось бы так:
 for auto aChild in Self.Children
 begin
  for auto aChild in aChild.Children
  begin
   aChild .ExecuteGenerator
  end; // for
  aChild .ExecuteGenerator
 end; // for

-- И БУДУ к этому стремится.

Но ПОКА - не получается.

Что такое "auto" людям знакомым с C++11 - Должно быть известно :-)

Хотя "для скриптов" можно наверное и БЕЗ auto.

Вот так:

 for aChild in Self.Children
 begin
  for aChild in aChild.Children
  begin
   aChild .ExecuteGenerator
  end; // for
  aChild .ExecuteGenerator
 end; // for

2 комментария:

  1. Зато "каждый дурак" поймет - а это гигантский плюс.

    ОтветитьУдалить
    Ответы
    1. "Зато "каждый дурак" поймет - а это гигантский плюс."

      Вот мне тоже так кажется :-)

      А в итоге получилось вот что:
      for Self.Children
      begin
      OBJECT IN aChild
      aChild .ExecuteGenerator
      end; // for

      или
      for .Children
      begin
      OBJECT IN aChild
      aChild .ExecuteGenerator
      end; // for

      Удалить