Wiki

Clone wiki

MindStream / Статьи на русском / О кодогенерации / Коротко. Доделал переопределения слов

По мотивам - Коротко. Сделал чудную штуку - переопределение слов

Теперь код:

#!delphi 
USES
 axiom:ComboBox
 axiom:ComboTree
;

REDEFINITION
 : pop:ComboBox:DropDown
  OBJECT IN aCombo
  if ( aCombo Is class::TvtComboTree ) then
   ( aCombo pop:ComboTree:DropDown )
  else 
   ( aCombo inherited )
 ; // pop:ComboBox:DropDown

Можно переписать так:

#!delphi 
USES
 axiom:ComboBox
 axiom:ComboTree
 axiom:ComboTreeEx
;

REDEFINITION
 : pop:ComboBox:DropDown
  OBJECT IN aCombo
  callIfAccepted aCombo [ 
   [ @ class::ComboTreeEx @ pop:ComboTreeEx:DropDown ]
    // pop:ComboTreeEx:DropDown вызывается, если aCombo совместим с ComboTreeEx
   [ @ class::ComboTree @ pop:ComboTree:DropDown ]
    // pop:ComboTree:DropDown вызывается, если aCombo совместим с ComboTree
   [ nil @ inherited ]
    // вызывается если все остальные ветки не прошли 
  ] // callIfAccepted aCombo
 ; // pop:ComboBox:DropDown

"Под капотом" это всё крайне просто устроено.

Позже допишу. Ну и можно даже так написать:

#!delphi 
USES
 axiom:ComboBox
 axiom:ComboTree
 axiom:ComboTreeEx
;

REDEFINITION
 : pop:ComboBox:SetValue
  ANY IN aValue
  OBJECT IN aCombo
  callIfAccepted [ aValue aCombo ] [ 
   [ @ INTEGER @ class::ComboTreeEx @ pop:ComboTreeEx:SetValue ]
    // pop:ComboTreeEx:DropDown вызывается, если aCombo совместим с ComboTreeEx,
    // а aValue совместимо с INTEGER
   [ @ STRING @ class::ComboTree @ pop:ComboTree:SetValue ]
    // pop:ComboTree:DropDown вызывается, если aCombo совместим с ComboTree,
    // а aValue совместимо с STRING
   [ @ ANY nil @ inherited ]
    // вызывается если все остальные ветки не прошли 
  ] // callIfAccepted aCombo
 ; // pop:ComboBox:DropDown

Возможно это можно упрощать.

В плане минимизации использования @.

А можно так:

#!delphi 
USES
 axiom:ComboBox
 axiom:ComboTree
 axiom:ComboTreeEx
;

REDEFINITION
 : pop:ComboBox:SetValue
  ANY IN aValue
  OBJECT IN aCombo
  callIfAccepted [ aValue aCombo ] [ 
   [ @ INTEGER @ class::ComboTreeEx @ pop:ComboTreeEx:SetValue ]
    // pop:ComboTreeEx:DropDown вызывается, если aCombo совместим с ComboTreeEx,
    // а aValue совместимо с INTEGER
   [ @ STRING @ class::ComboTree @ pop:ComboTree:SetValue ]
    // pop:ComboTree:DropDown вызывается, если aCombo совместим с ComboTree,
    // а aValue совместимо с STRING
   [ @ STRING @ class::ComboBox @ inherited ]
    // inherited вызывается, если aCombo совместим с ComboBox,
    // а aValue совместимо с STRING
   [ @ ANY @ ANY @ NotImplemented ]
    // вызывается если все остальные ветки не прошли 
    // и вызывает ошибку NotImplemented
  ] // callIfAccepted aCombo
 ; // pop:ComboBox:DropDown

А можно сделать так:

#!delphi 
USES
 axiom:ComboBox
 axiom:ComboTree
 axiom:ComboTreeEx
;

REDEFINITION
 : pop:ComboBox:SetValue
  ANY IN aValue
  OBJECT IN aCombo
  callIfAccepted [ aValue aCombo ] [ 
   @[ INTEGER class::ComboTreeEx pop:ComboTreeEx:SetValue ]
    // pop:ComboTreeEx:DropDown вызывается, если aCombo совместим с ComboTreeEx,
    // а aValue совместимо с INTEGER
   @[ STRING class::ComboTree pop:ComboTree:SetValue ]
    // pop:ComboTree:DropDown вызывается, если aCombo совместим с ComboTree,
    // а aValue совместимо с STRING
   @[ STRING class::ComboBox inherited ]
    // inherited вызывается, если aCombo совместим с ComboBox,
    // а aValue совместимо с STRING
   @[ ANY ANY NotImplemented ]
    // вызывается если все остальные ветки не прошли 
    // и вызывает ошибку NotImplemented
  ] // callIfAccepted aCombo
 ; // pop:ComboBox:DropDown
  • минимизируем использование @.

Updated