четверг, 24 марта 2016 г.

#1206. Только код. Хеширование строк и использование строк как итераторов

'ДОКУМЕНТ' .
'ДОКУМЕНТ' string:ToUnicode .

'--------' .

'ДОКУМЕНТ' string:CodePage .
'ДОКУМЕНТ' string:ToUnicode string:CodePage .

'--------' .

'ДОКУМЕНТ' string:Hash .
'ДОКУМЕНТ' string:ToUnicode string:Hash .

'--------' .

'ДОКУМЕНТ' string:SmallHash .
'ДОКУМЕНТ' string:ToUnicode string:SmallHash .

'--------' .

'ДОКУМЕНТ' string:Hash:New .
'ДОКУМЕНТ' string:ToUnicode string:Hash:New .

'--------' .

'ДОКУМЕНТ' string:SmallHash:New .
'ДОКУМЕНТ' string:ToUnicode string:SmallHash:New .

'--------' .

Hash16Table .for> .

'--------' .

'ДОКУМЕНТ' string:Iterator .for> .

'--------' .

'ДОКУМЕНТ' string:Iterator .for> ( char:ToString . )

'--------' .

'ДОКУМЕНТ' string:ToUnicode string:Iterator .for> ( char:ToString . )

'--------' .

#1205. Ссылка. Обновление кодогенерации

#1204. Ссылка. VLO Framework

https://sourceforge.net/projects/vloframework/

Description

VLO framework (Visually linked Objects) is a development platform done in Delphi 2010 that allows you to draw TObjects in a TCanvas and link them with connectors.

среда, 16 марта 2016 г.

#1202. "Offtopic". Ссылка. Как опубликовать свою работу в системе ГАРАНТ?

#1201. Ни о чём. Начинаю проникаться функциональным подходом

Начинаю проникаться функциональным подходом.

При написании своих шаблонов кодогенерации.

Или скорее - "моей интерпретацией (интертрепацией) функционального подхода".

Всякие там map/reduce и иже с ними.

А также ленивые вычисления и кеширование ранее вычисленного результата.

Без всяких правда "закорючек" и "монад".

Ну и "сам подход": Вход -> Преобразование -> Выход.

Ну и типа работа с коллекциями (filter/map):

ARRAY FUNCTION .OperationsNeededElements
  ARRAY IN anArray
 anArray .mapToTargetAndValueType>
 .join> ( 
  anArray 
  .filter> .IsMessage 
  .filter> ( .GetUP "Message ID" 'CM_' SWAP StartsStr )
  .map> ( DROP GarantModel::Controls ) 
 ) // .join>
 .joinWithLambded> anArray ( .Parameters .mapToTargetAndValueType> )
 .joinWithLambded> anArray ( .AttributesAndOperations call.me )
 .joinWithLambded> anArray .CanRaise
 .joinWithLambded> anArray .CanRaiseInSet
 >>> Result 
; // .OperationsNeededElements

ARRAY FUNCTION .CommaListWith()
  ARRAY IN aList
 [
  VAR l_WasComma
  false >>> l_WasComma
  aList .for> ( 
   .WithComma: l_WasComma .KeepInStack
  )
 ] .With() >>> Result
; // .CommaListWith()
  
ARRAY elem_func ParametersList
 Cached:
 (
  Self .MethodParameters .map> .Name .CommaListWith()
 )
 >>> Result
; // ParametersList

...

elem_proc OutUses:
  STRING IN aUCPrefix
  ^ IN aUsed
  ^ IN aLambda
  
 ARRAY VAR l_Used
 aUsed DO >>> l_Used
  
 ARRAY FUNCTION .filterUsed>
   ARRAY IN anArray
  anArray
  .filter> ( 
    IN anItem 
   anItem .UnitName >>> anItem 
   if ( anItem l_Used array:Has ! ) then
   begin
    anItem array:AddTo l_Used
    true
   end
   else
   begin
    false
   end 
  ) >>> Result  
 ; // .filterUsed> 
  
 'uses' .Out
   VAR l_NeedComma
   false >>> l_NeedComma
   Indented: ( 
    aLambda DO 
     .map> .UnitProducer 
     .filterNil> 
     .filterMixIns>
     .filter> ( Self ?!= )
     .filter> ( .UnitName Self .UnitName ?!= )
     .filter> ( .UnitName 'System' ?!= )
     //.map> .UnitName 
     .filterUsed> 
     .for> ( 
       IN anItem
      anItem .IfDef: ( anItem .UnitName .WithComma: l_NeedComma .Out )
     ) // .for>
     
    if ( Self .IsElementProxy ) then
    begin
     Self .UserCode: aUCPrefix ()
    end // ( Self .IsElementProxy )
    
   ) // Indented:
 ';' .Out
 OutLn
; // OutUses:

...

BOOLEAN elem_func HasFactory
 Cached:
 (
  Self .Operations .filter> .IsFactory .CountIt > 0
 ) 
 >>> Result
; // HasFactory

...

BOOLEAN elem_func NeedFinalize
 Cached:
 (
  RULES
   ( Self IsNil )
    false
   DEFAULT
    ( 
     Self .Attributes 
     .filter> ( .Target .IsManaged )
     .CountIt > 0
     OR ( Self .MainAncestor call.me )
    )
  ; // RULES  
 )
 >>> Result
; // NeedFinalize

...

BOOLEAN elem_func InheritsFrom
  STRING IN anAncestor
 anAncestor :Cached:
 ( 
  RULES
   ( Self .TypeName anAncestor == )
    true
   DEFAULT
    (
     Self .Inherits 
     .filter> ( anAncestor call.me )
     .CountIt > 0
    )
  ; // RULES
 ) 
 >>> Result
; // InheritsFrom

...

BOOLEAN elem_func IsConstructorsHolder
 ( Self .MainAncestor IsNil ! )
 AND ( Self .Attributes .CountIt <= 0 )
 AND ( Self .Operations .filter> ( .IsConstructor ! ) .CountIt <= 0 )
 >>> Result
; // IsConstructorsHolder

...

BOOLEAN elem_func InheritsOrImplementsAcceptableForScripts
 Cached:
 (
  RULES
   ( Self .Inherits .filter> .IsAcceptableForScripts .CountIt > 0 )
    true
   ( Self .Implements .filter> .IsAcceptableForScripts .CountIt > 0 )
    true
   DEFAULT
    false
  ; // RULES 
 )
 >>> Result
; // InheritsOrImplementsAcceptableForScripts

...

BOOLEAN elem_func SomeAncestorImplements
  ModelElement IN anIntf
  
 BOOLEAN elem_func ImplementsLoc
  Self .Implements .filter> ( anIntf ?== ) .CountIt > 0 >>> Result
 ; // ImplementsLoc
 
 anIntf :Cached:
 (
  RULES
   ( Self .IsTypedef )
     RULES
      ( Self .IsPointer )
       false
      DEFAULT
       ( Self .MainAncestorPrim anIntf call.me )
     ; // RULES
   ( Self .Inherits .filter> .ImplementsLoc .CountIt > 0 )
    true 
   ( Self .Inherits .filter> ( anIntf call.me ) .CountIt > 0 )
    true 
   ( Self .Implements .filter> .IsMixIn .filter> .ImplementsLoc .CountIt > 0 )
    true 
   ( Self .Implements .filter> .IsMixIn .filter> ( anIntf call.me ) .CountIt > 0 )
    true 
   DEFAULT
    false  
  ; // RULES 
 )
 >>> Result 
; // SomeAncestorImplements

...

BOOLEAN elem_func InheritsOrImplementsMixIn
 Cached:
 (
  RULES
   ( Self .Inherits .filter> .IsMixIn .CountIt > 0 )
    true
   ( Self .Implements .filter> .IsMixIn .CountIt > 0 )
    true
   DEFAULT
    false
  ; // RULES 
 )
 >>> Result
; // InheritsOrImplementsMixIn

...

BOOLEAN elem_func ImplementsMixIn
 Cached:
 (
  RULES
   //( Self .Inherits .filter> .IsMixIn .CountIt > 0 )
   // true
   ( Self .Implements .filter> .IsMixIn .CountIt > 0 )
    true
   DEFAULT
    false
  ; // RULES 
 )
 >>> Result
; // ImplementsMixIn

...

elem_iterator OtherMixinValuesUses
 [empty]
 .joinWithLambded> ( Self .Inherits ) ( .MixInValues .mapToTarget> )
 .joinWithLambded> ( Self .Inherits ) call.me
 >>> Result
; // OtherMixinValuesUses

...

BOOLEAN elem_func NeedsFakeMethod
 Cached:
 (
  RULES
   ( Self .IsAutoHelper )
    true
   ( Self .Properties .filter> ( .ReadsField ! ) .CountIt > 0 )
    true 
   DEFAULT
    false 
  ; // RULES
 )
 >>> Result
; // NeedsFakeMethod

...

BOOLEAN elem_func IsSimpleClass
 Cached:
 (
  RULES
   ( Self .IsStereotype st_UseCaseControllerImp )
    ( Self .Abstraction at_abstract != )
   ( Self .IsStereotype st_ViewAreaControllerImp )
    ( Self .Abstraction at_abstract != )
   ( Self .IsStereotype st_SimpleClass ) 
    true
   ( Self .IsStereotype st_ObjStub ) 
    true
   ( Self .IsService ) 
    true
   ( Self .IsServiceImplementation ) 
    true
   ( Self .IsScriptKeyword ) 
    true
   ( Self .IsTestCase ) 
    true
   ( Self .IsStereotype st_GuiControl ) 
    true
   ( Self .IsVCMForm ) 
    true
   ( Self .IsStereotype st_VCMFinalForm ) 
    true
   ( Self .IsStereotype st_VCMContainer ) 
    true
   ( Self .IsStereotype st_VCMFinalContainer ) 
    true
   DEFAULT
    false 
  ; // RULES
 )  
 >>> Result
; // IsSimpleClass
 
BOOLEAN elem_func IsScriptKeywordsPack
 Self .IsStereotype st_ScriptKeywordsPack >>> Result
; // IsScriptKeywordsPack

BOOLEAN elem_func IsUtilityPack
 Cached:
 (
  RULES
   ( Self .IsStereotype st_UtilityPack )
    true
   ( Self .IsScriptKeywordsPack ) 
    true
   DEFAULT
    false
  ; // RULES 
 ) 
 >>> Result
; // IsUtilityPack

BOOLEAN elem_func IsInterfaces
 Cached:
 (
  RULES
   ( Self .IsStereotype st_Interfaces ) 
    true
   ( Self .IsStereotype st_InternalInterfaces )
    true
   DEFAULT
    false
  ; // RULES 
 )
 >>> Result
; // IsInterfaces

: .FirstElement
  ARRAY IN anArray
 ModelElement VAR l_Found
 nil >>> l_Found
 anArray .trunc> ( DROP l_Found IsNil ) .for> ( >>> l_Found )
 l_Found
; // .FirstElement

: .SecondElement
  ARRAY IN anArray
 ModelElement VAR l_Found
 nil >>> l_Found
 INTEGER VAR l_Index
 0 >>> l_Index
 anArray .trunc> ( DROP l_Index < 2 ) .for> (
   IN anItem
  ( l_Index 1 == ) ? 
   ( anItem >>> l_Found ) 
  INC l_Index 
 ) // anArray .trunc> ( DROP l_Index < 2 ) .for>
 l_Found
; // .SecondElement



#1200. Ссылка. Обновление кодогенерации

суббота, 12 марта 2016 г.

#1199. Ссылка. Что же тут написано? Я совсем забыл английский? Или кто-то со сленгом перебарщивает?

https://plus.google.com/u/0/+PatrickHughes/posts/gwM7X7ujPoD?cfem=1

"Well I'll be a son of a -

I'm finally getting my feet wet with Seattle and I thought I would do some GetIt exploring - my first visit and I've got a question or two.

Lo and behold I see some favorites:

VirtualTree - is this the same as VirtualTreeView originally created by Mike Lischke?

Along with that I see MustangPeak VirtualShellTools and EasyListView Has anyone here used these? I'm assuming since they are listed in GetIt they are functional in Seattle?

What do they mean source-only

What is TurboPack

What are some of your favorites?"

Я совсем забыл английский? Или кто-то со сленгом перебарщивает?

пятница, 11 марта 2016 г.

#1198. Скрипты. Добавление методов "на лету"

PROGRAM SetWord.ms.script

USES
 Testing.ms.dict
;

: Holder
; // Holder

Test&Dump SetWordTest
 VAR W
 @ Holder @ . 'A' AddMethod >>> W
 W pop:KeyWord:Name .

 W pop:KeyWord:Word .
 W pop:KeyWord:Word pop:Word:Name .
 'X' W pop:KeyWord:Word DO
 'Y' Holder -> A
 'Z' Holder ->^ 'A' DO

 @ Holder .AddMethodWithParams: 'B' 'Hello' .
 Holder -> B

 @ Holder .AddMethodWithParams: 'C' @ . .
 Holder -> C

 @ Holder .AddMethodWithParams: 'D' ( 1 2 3 ) ( . . . )
 Holder -> D

 @ Holder .AddMethodWithParams: 'E' ( 1 2 3 ) ( IN p1 IN p2 IN p3 p1 . p2 . p3 . )
 Holder -> E
; // SetWordTest

SetWordTest

Пример использования:

INTERFACE elem_func RegisterServiceImplementationMethod
 //Cached:
 (
  'bind' nil MakeFunction
  DUP
  VAR l_Boxed
  pop:WordBox:Boxed >>> l_Boxed
  l_Boxed -> Stereotype := st_ini::Operation
  l_Boxed -> Visibility := PrivateAccess
  l_Boxed -> %SUM := ( 'Регистрация ' Self .TypeName Cat )
  //l_Boxed ->^ cUserCodePrefix ^:= ( Self .BindServiceImplementationUC )
  l_Boxed .AddMethodWithParams: cUserCodePrefix Self .BindServiceImplementationUC
 )
 >>> Result
; // RegisterServiceImplementationMethod

#1197. Ссылка. www.turbococoa.com. Создание нативных приложений для iOS БЕЗ FireMonkey

https://plus.google.com/105693813343868727274/posts/iegD9p4rLhz

"Hi Delphi people! Good news: Delphi CAN BE USED for true-native app development for iOS/Mac OS. Only small plugin needed www.turbococoa.com. Download for free. Your feedback welcome!"

http://www.turbococoa.com/

"

Build native application using Delphi directly in Xcode

Design in Xcode. Code in Delphi. Build with TurboCocoa.
Do you want to know, how you can do true-native iOS/Mac OS apps in Delphi? Read our FAQ, watch our video, start your TurboCocoa."

вторник, 1 марта 2016 г.

#1195. Эмуляция for..to

http://blog.marcocantu.com/blog/2016-february-stepping-values-for-loop.html

https://bitbucket.org/lulinalex/mindstream/commits/54a55b7cdfd83633727028150df2b5d8412ac44c

Test ForToTest

 ARRAY operator to 
   ^@ IN aFrom
   ^ IN aTo
  @ ( 
   OBJECT IN aLambda
   INTEGER VAR I
   I := ( aFrom DO )
   Dec I
   ( aTo DO I ) - LOOP ( Inc I I aLambda DO ) 
  ) FunctorToIterator >>> Result
 ; // 1to
 
 for ( 1 to 10 ) .
 // - печатает числа от 1 до 10
 '' .
 for ( 1 to 20 ) .
 // - печатает числа от 1 до 20
 '' .
 for ( 0 to 20 ) .
 // - печатает числа от 0 до 20
 '' .
 for ( -1 to 20 ) .
 // - печатает числа от -1 до 20
 '' .
 for ( -1 to 21 ) .
 // - печатает числа от -1 до 21
 '' .
 0 for ( 1 to 10 ) + .
 // - суммирует числа от 1 до 10 и печатает результат
 '' .
 for ( 1 to 10 Reverted ) .
 // - печатает числа от 10 до 1
 
/*{ 
 ARRAY VAR L
 
 1to 10 >>> L
 
 @ . L ITERATE
 // - печатает числа от 1 до 10
 '' .
 @ . 1to 20 ITERATE
 // - печатает числа от 1 до 20
 '' .
 0 @ + L ITERATE .
 // - суммирует числа от 1 до 10 и печатает результат
 '' .
 @ . L Reverted ITERATE
 // - печатает числа от 10 до 1}*/
; // ForToTest

ForToTest

Понятно, что step несложно добавить - в Inc I - написать I := I + Step

У меня по-моему "несколько лаконичнее" вышло, чем у гуру.

#1194. Ссылка. Обновление кодогенерации