Escrito por

Project Manager & Head of Interoperability at Salutic Soluciones, S.L.
Artículo Kurro Lopez · ago 31, 2021 2m read

FOREACH para ObjectScript

Como sabes, ObjectScript no tiene un comando o función de sistema FOREACH.
Pero tiene un amplio margen para la creatividad.

Pero la tarea es recorrer una matriz global o local y hacer algo PARA CADA elemento.

Hay dos posibles soluciones:

  • Crear una macro que genere las secuencias de código requeridas
  • Crear un comando extendido para realizar la acción.

Ambas formas están presentes aqui.
La macro es una solución genérica y bastante flexible y fácil de adaptar si es necesario.

##;FOREACHMACRO ; macro definitions
##; %key = variable provide to loop trough array
##; %arr = the gobal or local array to be looped on
##; %the method or routine to be executed for each node.
##; $$$foreach = forward loop $$$foreeachR = reverse loop
#define foreach(%key,%arr,%do) set %key="" for  set %key=$o(%arr(%key)) q:%key=""  do %do
#define foreachR(%key,%arr,%do) set %key="" for  set %key=$o(%arr(%key),-1) q:%key=""  do %do

Simplemente incluye la macro y aplícala.
E:jemplo

#include FOREACHMACROtest $$$foreach(key,^rcc,show)     quitshow zwrite @$zr,! quit

La creación de una extensión de comando está disponible para todos los namespaces.

Debe incluirse en %ZLANGC00.mac  por #include ZZFOREACH  
el código relacionado está aquí:

##; run $order() ascending or descending on global or local arrays ##; pass semicolon separated parameter string ("%array;%do;%fwd,;%key")##; %array = global or local variable name##; %do = routine or method to be executed for each run##; %fwd = 1/-1 loop direction ascending / descending, default = 1##; %key = first key if existingZZFOREACH(%par) public {   set %par=$lfs(%par,";")   new %array,%do,%fwd,%key,%val   set %array=$lg(%par,1),%do=$lg(%par,2),%fwd=$lg(%par,3),%key=$lg(%par,4)   if '%fwd set %fwd=1   if %key]"" set %key=$o(@%array@(%key),$s(%fwd<1:-1,1:1))   for  set %key=$o(@%array@(%key),%fwd,%val) quit:%key=""  do @%do   quit 1    }

Además de la macro, el comando permite opcionalmente ejecutar zzFOREACH desde un punto de inicio proporcionado hacia adelante o hacia atrás
Ejemplo:

DEMO>zzforeach "^rcc;show^dump(%array,%key,%val)"
^rcc(1) = 1
^rcc(2) = 2
^rcc(3) = 3
^rcc(4) = 4
^rcc(5) = 5

o del subíndice 3:

DEMO>zzforeach "^rcc;show^dump(%array,%key,%val);;3"
^rcc(3) = 3
^rcc(4) = 4
^rcc(5) = 5

O lo mismo inverso:

DEMO>zzforeach "^rcc;show^dump(%array,%key,%val);-1;3"
^rcc(3) = 3
^rcc(2) = 2
^rcc(1) = 1


Los archivos INC están disponibles en OEX con ZPM