вторник, 2 февраля 2016 г.

#1191. YAGNI


#1190. Ссылка. Is it "compile-time injection" possible?

https://plus.google.com/u/0/+DavidBerneda/posts/WhyNCmdtzbe?cfem=1

"Is it "compile-time injection" possible? I was thinking on the ability to attribute for example a class with members that are defined outside that class, and the compiler will just accept them.

ie: type [Extend(TFooExtender)] TFoo=class end;
TFooExtender=class(TBaseExtender).... end;
TBar=record Num:Integer end;

To allow this at compile-time:

var foo : TFoo; foo.Bar.num:=42;

TFooExtender will return 'Bar' of type TBar as a valid member of TFoo, and the compiler will just accept it.

At runtime, TFooExtender is the one that "glues" foo and bar, so it will run just fine."

Я знаю, как сделать подобное с примесями. Только зачем?

суббота, 30 января 2016 г.

#1188. Ох функциональщина

USES
 params.ms.dict
 axiom_push.ms.dict
 core.ms.dict
 ElementsRTTI.ms.dict
 Generation.ms.dict
;

kind_NormalClass .

STRING FUNCTION ValueToKey
  ANY IN aValue
 RULES
  ( aValue IsString )
   aValue
  ( aValue IsArray )
   ( 
    aValue 
    .map> call.me
    strings:Cat
   )
  (
   ( aValue IsObj )
   AND ( aValue Is class::TtfwWord )
  ) 
   ( 
     VAR l_UID
     aValue .UID >>> l_UID
     if ( l_UID IsNil ) then
     begin
      aValue pop:Word:Name 
     end // ( l_UID Is Nil )
     else
      l_UID 
   )
  ( aValue IsIntf )
   ERROR 'Невозможно построить ключ для интерфейса'
  ( aValue IsObj )
   ERROR 'Невозможно построить ключ для абстрактного объекта'
  ( aValue IsBool )
   ( aValue ToPrintable )
  ( aValue IsInt )
   ( aValue ToPrintable )  
  ( aValue IsNil )
   ''   
  DEFAULT
   ( aValue ToPrintable )
 ; // RULES
 >>> Result
; // ValueToKey

: A
 CONST UID 'xxxA'
; // A

: B
 CONST UID 'xxxB'
; // B

: C
; // C

'a' ValueToKey .
true ValueToKey .
false ValueToKey .
[ true ] ValueToKey .
[ false ] ValueToKey .
[ false true ] ValueToKey .
[ true false ] ValueToKey .
[ 'a' true false 'b' ] ValueToKey .
@ A ValueToKey .
@ B ValueToKey .
[ @ A ] ValueToKey .
[ @ B ] ValueToKey .
[ @ A @ B ] ValueToKey .
[ @ A [ @ B ] ] ValueToKey .
[ [ @ A @ B ] ] ValueToKey .
123 ValueToKey .
kind_NormalClass ValueToKey .
@ C ValueToKey .
[empty] ValueToKey .
[] ValueToKey .
[ ] ValueToKey .
@ () ValueToKey .
@ ( ) ValueToKey .

@ A .UID .
@ B .UID .

"Если любящему ООП программисту дать машинку для закручивания крышек на банках с огурцами - не сомневайтесь: он выстроит иерархию из 25 наследников и приспособит её в качестве электрической зубной щётки.
Если вдруг этого не произойдёт - значит вам попался неправильный ООП-программист, видимо, он на самом деле - латентный функциональщик."

Латентный функциональщик.... Да...

#1187. Функциональщина

USES
 params.ms.dict
 core.ms.dict
 ElementsRTTI.ms.dict
 Generation.ms.dict
;

kind_NormalClass .

STRING FUNCTION ValueToKey
  ANY IN aValue
 RULES
  ( aValue IsString )
   aValue
  ( aValue IsArray )
   ( 
    aValue 
    .map> call.me
    strings:Cat
   )
  (
   ( aValue IsObj )
   AND ( aValue Is class::TtfwWord )
  ) 
   ( aValue pop:Word:Name )
  ( aValue IsIntf )
   ERROR 'Невозможно построить ключ для интерфейса' 
  DEFAULT
   ( aValue ToPrintable )
 ; // RULES
 >>> Result
; // ValueToKey

: A
 CONST UID 'xxxA'
; // A

: B
 CONST UID 'xxxB'
; // B

'a' ValueToKey .
true ValueToKey .
false ValueToKey .
[ true ] ValueToKey .
[ false ] ValueToKey .
[ false true ] ValueToKey .
[ true false ] ValueToKey .
[ 'a' true false 'b' ] ValueToKey .
@ A ValueToKey .
@ B ValueToKey .
[ @ A ] ValueToKey .
[ @ B ] ValueToKey .
[ @ A @ B ] ValueToKey .
[ @ A [ @ B ] ] ValueToKey .
[ [ @ A @ B ] ] ValueToKey .
123 ValueToKey .

@ A .UID .
@ B .UID .