Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring

_Créditos das imagens: ChatGPT_ ### LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring Resolver o problema do [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/description/) é um exercício clássico de programação, que desafia desenvolvedores a encontrar a maior substring palindrômica dentro de uma string. Recentemente, exploramos soluções tanto em Harbour quanto em TLPP (Total Language Protheus Programming). Neste artigo, comparamos as implementações nessas duas linguagens, destacando suas semelhanças, diferenças e funcionalidades específicas. #### Implementações em Harbour ##### Versão 5.1 Essa solução utiliza a técnica de expansão a partir do centro do palíndromo. Cada caractere ou par de caracteres consecutivos é considerado um possível "centro". O algoritmo expande em ambas as direções enquanto os caracteres forem iguais, retornando o maior palíndromo encontrado. ##### Versão 5....

BlackTDN :: ADVPL ~ PARAMTYPE

TotvsDevStudio :: ParamType : Debug

Legal esse #include "parmtype.ch", ele nos permite definir os tipos das variáveis formais que são verificadas em tempo de execução (melhor seria em tempo de compilação: deve ter isso no TDS). Mas tem um pequeno bug no "parmtype.ch" padrão e, em função disso, apropriei-me dele para criar uma versão “customizada” e corrigida. Ao comparar os dois includes perceberão a diferença e o “bug”. Antecipando, poderia dizer que: um dos problemas é o fato de não poder atribuir um valor a um uma variável objeto por “DEFAULT” o outro; é que o include padrão, quando parâmetro “OPTIONAL” e com “DEFAULT”, primeiro deveria atribuir o valor  para depois testar o tipo (problemas que não ocorrem na versão BlackTDN).

BlackTDN : prmType.ch vs TOTVS : prmType.ch BlackTDN : prmType.ch vs TOTVS : prmType.ch
BlackTDN : prmType.ch vs TOTVS : prmType.ch BlackTDN : prmType.ch vs TOTVS : prmType.ch

Dessa forma é possível atribuir valor “DEFAULT” a uma variável do tipo “OBJECT”, quando “OPTIONAL”, e ainda testar se o objeto passado corresponde à Classe Definida em “ParamType”. O mesmo podemos dizer para os demais tipos. No include padrão, quando o parâmetro é opcional com valor “DEFAULT” podemos, passar no “DEFAULT”, qualquer tipo que ele “engole”; já a versão BlackTDN não: a atribuição do “DEFAULT” é feita antes da verificação do tipo da variável. O arquivo “parmtype.ch” modificado poderá ser obtido ao clicar aqui e, para o código do exemplo, aqui.

ei-la:

   1: #ifndef __PARAMTYPE_CH
   2:     #define __PARAMTYPE_CH
   3:     #xcommand PARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT <text> [ MESSAGE <message> ] ;
   4:         => ;
   5:         [ UserException(<message>) ] ;;
   6:         [ UserException("argument #"+<"param">+" error, expected "+<text>) ] ;;
   7:         UserException("argument error in parameter "+<"varname">+", expected "+<text>)
   8:  
   9:     #xcommand CLASSPARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT <text,...> [ MESSAGE <message> ] ;
  10:         => ;
  11:         [ UserException(<message>) ] ;;
  12:         [ UserException("argument #"+<"param">+" error, class expected "+\"<text>\") ] ;;
  13:         UserException("argument error in parameter "+<"varname">+", class expected "+\"<text>\")
  14:  
  15:     #xcommand BLOCKPARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT <text> [ MESSAGE <message> ] ;
  16:         => ;
  17:         [ UserException(<message>) ] ;;
  18:         [ UserException("argument #"+<"param">+" error , return expected "+<text>) ] ;;
  19:         UserException("argument error in block "+<"varname">+", return expected "+<text>)
  20:         
  21:     #xcommand PARAMTYPE [ <param> VAR ] <varname> AS <type: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL, OBJECT> ;
  22:         [ , <typeN: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL, OBJECT> ] ;
  23:         [ MESSAGE <message> ] ;
  24:         [ <optional: OPTIONAL> ] ;
  25:         [ DEFAULT <uVar> ] ;
  26:         => ;
  27:         if (<.optional.>);;
  28:             <varname> := If(<varname> == nil,<uVar>,<varname>);;
  29:         endif;;    
  30:         If !(<.optional.> .and. ValType(<varname>) == "U") .and. !(ValType(<varname>) $ Subs(<"type">,1,1) [ + Subs(<"typeN">,1,1) ]) ;;
  31:             PARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT Subs(<"type">,1,1) [ + "," + Subs(<"typeN">,1,1) ]+"->"+ValType(<varname>) [ MESSAGE <message> ] ;;
  32:         EndIf ;;
  33:         
  34:     #xcommand PARAMTYPE [ <param> VAR ] <varname> AS BLOCK EXPECTED <expected: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL, OBJECT> ;
  35:         [ MESSAGE <message> ] ;
  36:         [ <optional: OPTIONAL> ] ;
  37:         => ;
  38:         If ValType(<varname>) == "B" ;;
  39:             __block := Eval(<varname>)  ;;
  40:             If ValType(__block) <> Subs(<"expected"> ,1,1)  ;;
  41:                 BLOCKPARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT Subs(<"expected">,1,1) + "->"+ValType(__block) [ MESSAGE <message> ] ;;
  42:             EndIf  ;;
  43:         ElseIf !(<.optional.> .and. ValType(<varname>) == "U") ;;
  44:             PARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT "B->"+ValType(<varname>) [ MESSAGE <message> ] ;;
  45:         EndIf
  46:         
  47:     #xcommand PARAMTYPE [ <param> VAR ] <varname> AS OBJECT CLASS <classname,...> ;
  48:         [ MESSAGE <message> ] ;
  49:         [ <optional: OPTIONAL> ] ;
  50:         [ DEFAULT <uVar> ] ;
  51:         => ;
  52:         if (<.optional.>);;
  53:             <varname> := If(<varname> == nil,<uVar>,<varname>);;
  54:         endif;;    
  55:         If ValType(<varname>) == "O" ;;
  56:             __erro := ErrorBlock({|| "UNDEFINED"}) ;;
  57:             BEGIN SEQUENCE ;;
  58:             __classname := Upper(<varname>:ClassName()) ;;
  59:             END SEQUENCE ;;
  60:             ErrorBlock(__erro)  ;;
  61:             If !(__classname $ Upper(\"<classname>\")) ;;
  62:                 CLASSPARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT <classname> [ MESSAGE <message> ] ;;
  63:             EndIf ;;
  64:         ElseIf !(<.optional.> .and. ValType(<varname>) == "U") ;;
  65:             PARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT "O->"+ValType(<varname>) [ MESSAGE <message> ] ;;
  66:         EndIf ;;    
  67:  
  68:     #xcommand PARAMTYPE [ <param> VAR ] <varname> AS <type: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL> ;
  69:         [ , <typeN: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL> ] ;
  70:         OR OBJECT CLASS <classname,...> ;
  71:         [ MESSAGE <message> ] ;
  72:         [ <optional: OPTIONAL> ] ;
  73:         => ;
  74:         If ValType(<varname>) == "O" ;;
  75:             PARAMTYPE [ <param> VAR ] <varname> AS OBJECT CLASS <classname> [ MESSAGE <message> ] [ <optional> ] ;;
  76:         Else ;;
  77:             PARAMTYPE [ <param> VAR ] <varname> AS <type> [, <typeN>] [ MESSAGE <message> ] [ <optional> ] ;;
  78:         EndIf
  79: #endif

um pequeno exemplo:



   1: #include "parmtype.ch" 
   2: User Function ParamType()
   3: Return(ParamType())
   4: Static Function ParamType(cVar,nVar,lVar,dVar,bVar,uVar,aVar,oVar)
   5:  
   6:     PARAMTYPE 1 VAR cVar AS CHARACTER          OPTIONAL DEFAULT ""
   7:     PARAMTYPE 2 VAR nVar AS NUMERIC            OPTIONAL DEFAULT 0
   8:     PARAMTYPE 3 VAR lVar AS LOGICAL            OPTIONAL DEFAULT .T.
   9:     PARAMTYPE 4 VAR dVar AS DATE               OPTIONAL DEFAULT Date()
  10:     PARAMTYPE 5 VAR bVar AS BLOCK              OPTIONAL DEFAULT { || .F. }
  11:     PARAMTYPE 6 VAR uVar AS CHARACTER,NUMERIC  OPTIONAL DEFAULT "0"
  12:     PARAMTYPE 7 VAR aVar AS ARRAY              OPTIONAL DEFAULT Array(0)
  13:     PARAMTYPE 8 VAR oVar AS OBJECT CLASS THASH OPTIONAL DEFAULT THASH():New() //CUSTOMIZED BY BLACKTDN
  14:  
  15: Return( NIL )

[]s
иαldσ dj

Comentários

Postagens mais visitadas