Diferencia entre revisiones de «Operadores estándares»
(No se muestran 46 ediciones intermedias del mismo usuario) | |||
Línea 2: | Línea 2: | ||
Dentro del [[Paradigma eWa]], se define un conjunto de [[operadores]] [[estándar]]es que son utilizados de igual manera para cualquiera de los [[Lenguajes de Programación eWa]]. Algunos de ellos son los mismos que se utilizan en otros [[lenguajes de programación]] (incluso [[tradicionales]]), pero existen numerosos [[operadores]] propios y algunos que, con la misma [[sintaxis]], producen diferentes resultados. | Dentro del [[Paradigma eWa]], se define un conjunto de [[operadores]] [[estándar]]es que son utilizados de igual manera para cualquiera de los [[Lenguajes de Programación eWa]]. Algunos de ellos son los mismos que se utilizan en otros [[lenguajes de programación]] (incluso [[tradicionales]]), pero existen numerosos [[operadores]] propios y algunos que, con la misma [[sintaxis]], producen diferentes resultados. | ||
− | Generalmente se dividen en grupos dependiendo de su cometido. A su vez, cada grupo se subdivide generalmente en dos, diferenciando los '''operadores atómicos''' y los '''operadores vectoriales''' que se aplican, respectivamente, a [[objetos|objetos atómicos]] u [[ | + | Generalmente se dividen en grupos dependiendo de su cometido. A su vez, cada grupo se subdivide generalmente en dos, diferenciando los '''operadores atómicos''' y los '''operadores vectoriales''' que se aplican, respectivamente, a [[objetos|objetos atómicos]] u [[conjunto]]s. |
Al crear una [[clase]], se pueden sobrescribir los [[procedimientos]] heredados de los '''[[operadores]] estándares'''. | Al crear una [[clase]], se pueden sobrescribir los [[procedimientos]] heredados de los '''[[operadores]] estándares'''. | ||
Línea 16: | Línea 16: | ||
** Si se detecta que el [[objeto]] "a" es el mismo [[objeto]] que el [[objeto]] "b" (porque sea el mismo o porque sea un ''alias''), el [[estándar]] especifica que se debe ignorar este [[operador]] de asignación en tiempo de [[compilación]]. | ** Si se detecta que el [[objeto]] "a" es el mismo [[objeto]] que el [[objeto]] "b" (porque sea el mismo o porque sea un ''alias''), el [[estándar]] especifica que se debe ignorar este [[operador]] de asignación en tiempo de [[compilación]]. | ||
** Si el [[objeto]] "a" no existe pero está definido (es una [[estructura]] '''#DEFINED'''), se crea previamente el [[objeto]] "a" de [[tipo]] "A". | ** Si el [[objeto]] "a" no existe pero está definido (es una [[estructura]] '''#DEFINED'''), se crea previamente el [[objeto]] "a" de [[tipo]] "A". | ||
− | * '''Devuelve''': | + | * '''Devuelve''': el propio [[objeto]] "a" ya modificado. |
=== '''Idéntico a''' ("a2:A <=> a1:A") === | === '''Idéntico a''' ("a2:A <=> a1:A") === | ||
Línea 24: | Línea 24: | ||
* '''Acción''': hace que el [[objeto]] "a2" sea el mismo (a [[código máquina|nivel físico]]) que el [[objeto]] "a1". | * '''Acción''': hace que el [[objeto]] "a2" sea el mismo (a [[código máquina|nivel físico]]) que el [[objeto]] "a1". | ||
** El [[objeto]] "a2" no se destruye por defecto, lo que puede generar [[Recolector de basura|basura inorgánica]] si se creó un [[objeto]] previamente. | ** El [[objeto]] "a2" no se destruye por defecto, lo que puede generar [[Recolector de basura|basura inorgánica]] si se creó un [[objeto]] previamente. | ||
− | * '''Devuelve''': | + | * '''Devuelve''': el propio [[objeto]] "a2", que también es "a1". |
Esta [[operación]] se puede considerar equivalente a que "a2" '''pase a ser un alias''' de "a1". | Esta [[operación]] se puede considerar equivalente a que "a2" '''pase a ser un alias''' de "a1". | ||
Línea 33: | Línea 33: | ||
* '''Acción''': crea un [[objeto]] de [[tipo]] "A" que asigna con el ''alias'' "a2", para luego hacer que "a2" sea igual a "a1", consiguiendo que finalmente el [[objeto]] "a2" sea una copia (''clon'') independiente del [[objeto]] "a1". | * '''Acción''': crea un [[objeto]] de [[tipo]] "A" que asigna con el ''alias'' "a2", para luego hacer que "a2" sea igual a "a1", consiguiendo que finalmente el [[objeto]] "a2" sea una copia (''clon'') independiente del [[objeto]] "a1". | ||
** Hay que destacar que el [[objeto]] "a2" original no se destruye; por lo tanto, si los dos [[objeto]]s fueran el mismo (''x >=< x'') y no tuvieran ningún ''alias'', se perdería la referencia generando [[Recolector de basura|basura inorgánica]]. | ** Hay que destacar que el [[objeto]] "a2" original no se destruye; por lo tanto, si los dos [[objeto]]s fueran el mismo (''x >=< x'') y no tuvieran ningún ''alias'', se perdería la referencia generando [[Recolector de basura|basura inorgánica]]. | ||
− | * '''Devuelve''': | + | * '''Devuelve''': el propio [[objeto]] "a2". |
− | === '''Igual a la parte entera de''' ("x =/ y") === | + | === Asignaciones aritméticas === |
+ | |||
+ | Estos [[operadores]] se centran en asignar el resultado de realizar [[operaciones]] aritméticas elementales entre un [[objeto]] numérico y el propio [[objeto]] donde se va a almacenar el resultado. Todos utilizan: | ||
+ | * "'''x'''": un [[objeto]] del [[tipo]] "A", generalmente numérico. | ||
+ | * "'''y'''": un [[objeto]] del [[tipo]] "B", generalmente numérico. | ||
+ | * '''Devuelve''': el propio [[objeto]] de [[tipo]] numérico "x". | ||
+ | |||
+ | ==== '''Igual a la parte entera de''' ("x:A =/ y:B") ==== | ||
''x '''igual a la parte entera de''' y'' | ''x '''igual a la parte entera de''' y'' | ||
− | * | + | * '''Acción''': equivalente en cuanto a tratamiento '''físico''' de los [[objetos]] al [[operador]] de igualdad. Asigna al [[objeto]] "x" de [[tipo]] numérico la parte entera del [[objeto]] de [[tipo]] numérico "y". |
− | * "'''y'''": | + | |
− | * '''Acción''': | + | ==== '''Incrementado en''' ("x:A += y:B") ==== |
− | * '''Devuelve''': | + | ''x '''incrementado en''' y'' |
+ | * '''Acción''': suma al valor del [[objeto]] "x" el valor del [[objeto]] "y". | ||
+ | |||
+ | ==== '''Incrementado en una unidad''' ("x:A ++") ==== | ||
+ | ''x '''incrementado en una unidad''''' | ||
+ | * '''Acción''': suma al valor del [[objeto]] "x" una unidad. | ||
+ | |||
+ | ==== '''Decrementado en''' ("x -= y") ==== | ||
+ | ''x '''decrementado en''' y'' | ||
+ | * '''Acción''': resta al valor del [[objeto]] "x" el valor del [[objeto]] "y". | ||
+ | |||
+ | ==== '''Decrementado en una unidad''' ("x --") ==== | ||
+ | ''x '''decrementado en una unidad''''' | ||
+ | * '''Acción''': resta al valor del [[objeto]] "x" una unidad. | ||
+ | |||
+ | ==== '''Multiplicado con''' ("x *= y") ==== | ||
+ | ''x '''multiplicado con''' y'' | ||
+ | * '''Acción''': multiplica al valor del [[objeto]] "x" por el valor del [[objeto]] "y". | ||
+ | |||
+ | ==== '''Dividido con''' ("x /= y") ==== | ||
+ | ''x '''dividido con''' y'' | ||
+ | * '''Acción''': divide al valor del [[objeto]] "x" entre el valor del [[objeto]] "y". | ||
+ | |||
+ | ==== '''Elevado con''' ("x ^= y") ==== | ||
+ | ''x '''elevado con''' y'' | ||
+ | * '''Acción''': eleva al valor del [[objeto]] "x" al exponente "y". | ||
+ | |||
+ | === Asignaciones aritméticas utilizando la parte entera === | ||
+ | |||
+ | Como se verá con los demás [[operadores]] aritméticos, se puede utilizar el [[operador]] correspondiente de '''parte entera''' para realizar las asignaciones aritméticas: | ||
+ | '''x +/= y''' | '''x -/= y''' | '''x */= y''' | '''x //= y''' | '''x ^/= y''' | ||
+ | |||
+ | === Asignación condicional === | ||
+ | |||
+ | Existen [[operadores]] de condición que permiten realizar [[operador|operaciones]] [[booleanas]] sobre [[objetos]] [[booleano]]s. Estas [[operadores|operaciones]] se pueden representar también como asignación nuclear añadiendo el símbolo "'''='''" al final del [[operador]] doble de condición: | ||
+ | '''b1 &&= b2''' | '''b1 ||= b2''' | '''b1 ^^= b2''' | ||
+ | |||
+ | === '''Concatenándole ''' ("v:V &= e:E") === | ||
+ | ''a '''concatenándole''' b'' | ||
+ | * "'''v'''": un [[objeto]] del [[tipo]] [[conjunto]] "V". | ||
+ | * "'''e'''": un [[objeto]] de un [[tipo]] "E" compatible con el [[conjunto]] de [[tipo]] "V". | ||
+ | * '''Acción''': concatena, ''por el final'', añadiendo el [[objeto]] "e" al [[conjunto]] "v". | ||
+ | * '''Devuelve''': el propio [[objeto]] "v" ya modificado. | ||
== Operadores aritméticos == | == Operadores aritméticos == | ||
− | Los [[operadores]] aritméticos están estandarizados para como interfaz de los [[objetos]] de [[tipo]] numérico. Son [[operadores]] destinados a realizar operaciones entre números o [[datos]] que se puedan considerar o tratar como | + | Los [[operadores]] aritméticos están estandarizados para ser utilizados como interfaz de los [[objetos]] de [[tipo]] numérico. Son [[operadores]] destinados a realizar operaciones entre números o [[datos]] que se puedan considerar o tratar como tales. |
=== Aritmética elemental === | === Aritmética elemental === | ||
Línea 65: | Línea 114: | ||
==== Dividido entre ("x:A / y:B") ==== | ==== Dividido entre ("x:A / y:B") ==== | ||
''x '''dividido entre''' y'' | ''x '''dividido entre''' y'' | ||
− | * '''Devuelve''': un nuevo [[objeto]] numérico que contenga el cociente de "x" entre "y". El [[estándar]] suele trabajar con precisión infinita, por lo tanto, se | + | * '''Devuelve''': un nuevo [[objeto]] numérico que contenga el cociente de "x" entre "y". El [[estándar]] suele trabajar con precisión infinita, por lo tanto, se suele utilizar internamente una organización en '''forma de quebrados''' para no perder la precisión. |
+ | |||
+ | ==== Resto de dividir entre ("x:A % y:B") ==== | ||
+ | '''''resto de''' x '''dividido entre''' y'' | ||
+ | * '''Devuelve''': un nuevo [[objeto]] numérico que contenga el resto de la división '''entera''' de "x" entre "y". | ||
+ | |||
+ | ==== Elevado a ("x:A ^ y:B") ==== | ||
+ | ''x '''elevado a''' y'' | ||
+ | * '''Devuelve''': un nuevo [[objeto]] numérico que contenga la potencia de base "x" y exponente "y". El [[estándar]] suele trabajar con precisión infinita, por lo tanto, se suele utilizar internamente una organización en '''forma de potencias''' para no perder la precisión. | ||
=== Aritmética entera === | === Aritmética entera === | ||
− | Generalmente la '''división entera''' es una operación que en la [[informática tradicional]] se utiliza habitualmente. La idea de las '''aritmética entera''' está muy presente en la [[estándar|estandarización]] de las [[operaciones]] aritméticas del [[Proyecto eWa]]. | + | Generalmente la '''división entera''' es una operación que en la [[informática tradicional]] se utiliza habitualmente. La idea de las '''aritmética entera''' está muy presente en la [[estándar|estandarización]] de las [[operador|operaciones]] aritméticas del [[Proyecto eWa]]. |
==== Suma entera con ("x:A +/ y:B") ==== | ==== Suma entera con ("x:A +/ y:B") ==== | ||
Línea 86: | Línea 143: | ||
''x '''división entera con''' y'' | ''x '''división entera con''' y'' | ||
* '''Devuelve''': un nuevo [[objeto]] '''numérico entero''' que contenga el cociente de "x" entre "y". | * '''Devuelve''': un nuevo [[objeto]] '''numérico entero''' que contenga el cociente de "x" entre "y". | ||
+ | |||
+ | ==== Potencia entera de ("x:A ^/ y:B") ==== | ||
+ | ''x '''potencia entera de''' y'' | ||
+ | * '''Devuelve''': un nuevo [[objeto]] numérico que contenga la parte entera del valor resultante de elevar la base "x" al exponente "y". | ||
== Operadores de comparación == | == Operadores de comparación == | ||
+ | Los [[operadores]] de comparación están [[estándar|estandarizados]] para ofrecer métodos cotidianos para comparar (ordenar, verificar, discriminar...) [[objetos]]. Todos ellos devuelven un valor [[booleano]]: | ||
+ | |||
+ | === Por semejanza === | ||
+ | |||
+ | ==== '''Es igual a''' ("a:A == b:B") ==== | ||
+ | ''a '''es igual a''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si el [[objeto]] "A" es igual ''campo a campo'' que el [[objeto]] "b". Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | ==== '''Es completamente igual a''' ("a:A === b:B") ==== | ||
+ | ''a '''es completamente igual a''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si el [[objeto]] "A" es igual ''campo a campo'' que el [[objeto]] "b" '''y además''' es del mismo [[tipo]]. Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | ==== '''Es idéntico a''' ("a:A <==> b:B") ==== | ||
+ | ''a '''es idéntico a''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si el [[objeto]] "A" es un ''alias'' del [[objeto]] "b". En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | ==== Inversos ==== | ||
+ | |||
+ | Existen también los [[operadores]] de comparación por semejanza inversos. Es decir, aquellos que devuelven ''cierto'' cuando su contrario devuelve ''falso'' y viceversa. Ambos devuelven ''undefined'' en los mismos casos. Su [[sintaxis]] es la misma pero cambiando el primer signo igual ("'''='''") por el signo de exclamación ("'''!'''"): | ||
+ | |||
+ | '''a != b''' | '''a !=== b''' | '''a <!=> b''' | ||
+ | |||
+ | === Por ordenación normal === | ||
+ | |||
+ | ==== '''Es menor que''' ("a:A << b:B") ==== | ||
+ | ''a '''es menor que''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si el [[objeto]] "A" es estrictamente menor, ''campo a campo'', que el [[objeto]] "b". Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | ==== '''Es menor o igual que''' ("a:A <= b:B") ==== | ||
+ | ''a '''es menor o igual que''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si el [[objeto]] "A" es menor o igual, ''campo a campo'', que el [[objeto]] "b". Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | ==== '''Es mayor o igual que''' ("a:A >= b:B") ==== | ||
+ | ''a '''es mayor o igual que''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si el [[objeto]] "A" es mayor o igual, ''campo a campo'', que el [[objeto]] "b". Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | ==== '''Es mayor que''' ("a:A >> b:B") ==== | ||
+ | ''a '''es mayor que''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si el [[objeto]] "A" es estrictamente mayor, ''campo a campo'', que el [[objeto]] "b". Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | === Devolviendo extremos === | ||
+ | |||
+ | ==== '''El menor de''' ("a:A < b:B") ==== | ||
+ | '''''el menor de''' a '''y''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el [[objeto]] "a" si la [[operación]] "a << b" devuelve ''cierto''; si devuelve ''undefined'', este [[operador]] devolverá ''undefined''; y en el otro caso, devolverá el [[objeto]] "b". | ||
+ | |||
+ | ==== '''El mayor de''' ("a:A > b:B") ==== | ||
+ | '''''el mayor de''' a '''y''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el [[objeto]] "a" si la [[operación]] "a >> b" devuelve ''cierto''; si devuelve ''undefined'', este [[operador]] devolverá ''undefined''; y en el otro caso, devolverá el [[objeto]] "b". | ||
+ | |||
+ | === Por ordenación extrema === | ||
+ | |||
+ | En ocasiones, se necesita saber si dos valores son muy diferentes. El [[estándar]] no marca un valor límite relativo o absoluto a partir del cual dos valores se consideran muy diferentes, pero sí determina que se debe de respetar la siguiente [[sintaxis]]: | ||
+ | |||
+ | ==== '''Es mucho mayor que''' ("a:A >>> b:B") ==== | ||
+ | ''a '''es mucho mayor que''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si el [[objeto]] "A" es mucho mayor, ''campo a campo'', que el [[objeto]] "b". Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | ==== '''Es mucho menor que''' ("a:A <<< b:B") ==== | ||
+ | ''a '''es mucho menor que''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si el [[objeto]] "A" es mucho menor, ''campo a campo'', que el [[objeto]] "b". Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | === Por ordenación aproximada === | ||
+ | |||
+ | También, hay veces en las que se necesita saber si dos valores están muy próximos. El [[estándar]] no marca un valor límite relativo o absoluto a partir del cual dos valores se consideran muy próximos, pero sí determina que se debe de respetar la siguiente [[sintaxis]]: | ||
+ | |||
+ | ==== '''Es aproximadamente igual''' ("a:A ~~ b:B") ==== | ||
+ | ''a '''es aproximadamente igual que''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si el [[objeto]] "A" es aproximadamente igual, ''campo a campo'', que el [[objeto]] "b". Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | ==== '''Es aproximadamente mayor que''' ("a:A >~ b:B") ==== | ||
+ | ''a '''es aproximadamente mayor que''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si el [[objeto]] "A" es aproximadamente mayor, ''campo a campo'', que el [[objeto]] "b". Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | ==== '''Es aproximadamente menor que''' ("a:A <~ b:B") ==== | ||
+ | ''a '''es aproximadamente menor que''' b'' | ||
+ | * "'''a'''": un [[objeto]] del [[tipo]] "A". | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] "B". El [[tipo]] "B" puede ser el propio [[tipo]] "A". | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si el [[objeto]] "A" es aproximadamente menor, ''campo a campo'', que el [[objeto]] "b". Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | == Operadores de condición == | ||
+ | Los [[operadores]] de condición están [[estándar|estandarizados]] para realizar operaciones [[booleano|booleanas]] entre [[objetos]] de tipo [[booleano]]. Todos ellos devuelven un valor [[booleano]] que se puede volver a utilizar. | ||
+ | |||
+ | Hay que tener en cuenta que tanto el [[operador]] con un solo "'''&'''" o con una sola "'''^'''" son diferentes a nivel [[semántica|semántico]] que los [[operadores]] condicionales. Respectivamente sirven para concatenar cadenas y para calcular potencias. | ||
+ | |||
+ | === Elementales === | ||
+ | |||
+ | ==== '''No''' ("! b:B") ==== | ||
+ | ''b '''negado'''''; ''NOT'' | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] [[booleano]]. | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si ambos el [[objeto]] "b" tienen el valor [[booleano]] ''falso''. Si el [[objeto]] "b" está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | ==== '''Y''' ("b1:B && b2:B") ==== | ||
+ | ''b1 '''y''' b2''; ''AND'' | ||
+ | * "'''b1'''": un [[objeto]] del [[tipo]] [[booleano]]. | ||
+ | * "'''b2'''": un [[objeto]] del [[tipo]] [[booleano]]. | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si ambos [[objetos]] tienen el valor [[booleano]] ''cierto''. Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | ==== '''O''' ("b1:B || b2:B") ==== | ||
+ | ''b1 '''o''' b2''; ''OR'' | ||
+ | * "'''b1'''": un [[objeto]] del [[tipo]] [[booleano]]. | ||
+ | * "'''b2'''": un [[objeto]] del [[tipo]] [[booleano]]. | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si al menos uno de los dos [[objetos]] tiene el valor [[booleano]] ''cierto''. Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | ==== '''O esclusivo''' ("b1:B ^^ b2:B") ==== | ||
+ | ''b1 '''o esclusivo''' b2''; ''XOR'' | ||
+ | * "'''b1'''": un [[objeto]] del [[tipo]] [[booleano]]. | ||
+ | * "'''b2'''": un [[objeto]] del [[tipo]] [[booleano]]. | ||
+ | * '''Devuelve''': el valor [[booleano]] ''cierto'' (1) si ambos [[objetos]] tienen el valor [[booleano]] ''cierto''. Si al menos uno de los dos [[objeto]]s está definido pero sin inicializar (es un '''#DEFINED'''), devuelve ''undefined''. En caso contrario, devuelve ''falso''. | ||
+ | |||
+ | === Extensiones === | ||
+ | |||
+ | ==== '''Ejecución condicionada''' ("b:B ? f:F") ==== | ||
+ | ''f '''se ejecuta si''' b '''es cierto''''' | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] [[booleano]]. | ||
+ | * "'''f'''": una [[función]]. | ||
+ | * '''Devuelve''': el valor producido por "f" si el [[objeto]] "b" tiene el valor [[booleano]] ''cierto''. Si no, devuelve ''undefiend''. | ||
+ | |||
+ | ==== '''Ejecución bicondicionada''' ("b:B ? f:F g:F") ==== | ||
+ | ''f '''se ejecuta si''' b '''es cierto, sino, se ejecuta''' g''; ''operador ternario'' | ||
+ | * "'''b'''": un [[objeto]] del [[tipo]] [[booleano]]. | ||
+ | * "'''f'''": una [[función]]. | ||
+ | * "'''g'''": una [[función]]. | ||
+ | * '''Devuelve''': el valor producido por "f" si el [[objeto]] "b" tiene el valor [[booleano]] ''cierto''. Si no, devuelve el valor producido por "g". | ||
+ | |||
+ | == Operadores vectoriales == | ||
+ | Los [[operadores]] vectoriales son operadores [[estándar]]es orientados a facilitar el trabajo con [[objetos]] de tipo [[conjunto]]. | ||
+ | |||
+ | === '''Elemento de''' ("v:V[i]") === | ||
+ | '''''elemento ''' i-'''ésimo de''' v'' | ||
+ | * "'''v'''": un [[objeto]] de [[tipo]] [[conjunto]] "V". | ||
+ | * "'''i'''": un [[objeto]] de [[tipo]] numérico. | ||
+ | * '''Devuelve''': el ''alias'' del hueco correspondiente al elemento "i"-ésimo del [[objeto]] "v". | ||
+ | |||
+ | === '''Elemento de''' ("v:V[i,l]") === | ||
+ | ''l '''elementos de''' v '''desde el ''' i-'''ésimo''''' | ||
+ | * "'''v'''": un [[objeto]] de [[tipo]] [[conjunto]] "V". | ||
+ | * "'''i'''": un [[objeto]] de [[tipo]] numérico. | ||
+ | * "'''l'''": un [[objeto]] de [[tipo]] numérico. | ||
+ | * '''Devuelve''': un [[conjunto|subconjunto]] del [[objeto]] "v" desde el elemento "i"-ésimo y con "l" elementos como máximo. | ||
+ | |||
+ | === '''Concatenado con''' ("v:V & w:W") === | ||
+ | ''v '''concatenado con''' w'' | ||
+ | * "'''v'''": un [[objeto]] de [[tipo]] [[conjunto]] "V". | ||
+ | * "'''w'''": un [[objeto]] de [[tipo]] [[conjunto]] "W". El [[tipo]] "W" puede ser el propio [[tipo]] "V". | ||
+ | * '''Devuelve''': un nuevo [[conjunto]] formado por los elementos del [[objeto]] "v" y, luego, los de "w". | ||
+ | ** Ni el [[conjunto]] de [[datos]] de "v" ni el de "w" son modificados. | ||
[[Categoría: Objeto]] | [[Categoría: Objeto]] |
Revisión actual del 20:15 12 abr 2012
Dentro del Paradigma eWa, se define un conjunto de operadores estándares que son utilizados de igual manera para cualquiera de los Lenguajes de Programación eWa. Algunos de ellos son los mismos que se utilizan en otros lenguajes de programación (incluso tradicionales), pero existen numerosos operadores propios y algunos que, con la misma sintaxis, producen diferentes resultados.
Generalmente se dividen en grupos dependiendo de su cometido. A su vez, cada grupo se subdivide generalmente en dos, diferenciando los operadores atómicos y los operadores vectoriales que se aplican, respectivamente, a objetos atómicos u conjuntos.
Al crear una clase, se pueden sobrescribir los procedimientos heredados de los operadores estándares.
Sumario
- 1 Operadores de asignación
- 2 Operadores aritméticos
- 3 Operadores de comparación
- 4 Operadores de condición
- 5 Operadores vectoriales
Operadores de asignación
Igual a ("a:A = b:B")
a igual a b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Acción: asigna, campo a campo, el valor del objeto "b" al objeto "a".
- Si una propiedad de "b" no existe en "a", no se asigna. Si una propiedad de "a" no existía en "b", se deja como está, es decir, con el valor anterior o el valor por defecto del tipo "A".
- Si se detecta que el objeto "a" es el mismo objeto que el objeto "b" (porque sea el mismo o porque sea un alias), el estándar especifica que se debe ignorar este operador de asignación en tiempo de compilación.
- Si el objeto "a" no existe pero está definido (es una estructura #DEFINED), se crea previamente el objeto "a" de tipo "A".
- Devuelve: el propio objeto "a" ya modificado.
Idéntico a ("a2:A <=> a1:A")
a2 idéntico a a1
- "a2": un objeto del tipo "A".
- "a1": un objeto del tipo "A".
- Acción: hace que el objeto "a2" sea el mismo (a nivel físico) que el objeto "a1".
- El objeto "a2" no se destruye por defecto, lo que puede generar basura inorgánica si se creó un objeto previamente.
- Devuelve: el propio objeto "a2", que también es "a1".
Esta operación se puede considerar equivalente a que "a2" pase a ser un alias de "a1".
Clonación de ("a2:A >=< a1:A")
a2 clonación de a1
- "a2": un objeto del tipo "A".
- "a1": un objeto del tipo "A".
- Acción: crea un objeto de tipo "A" que asigna con el alias "a2", para luego hacer que "a2" sea igual a "a1", consiguiendo que finalmente el objeto "a2" sea una copia (clon) independiente del objeto "a1".
- Hay que destacar que el objeto "a2" original no se destruye; por lo tanto, si los dos objetos fueran el mismo (x >=< x) y no tuvieran ningún alias, se perdería la referencia generando basura inorgánica.
- Devuelve: el propio objeto "a2".
Asignaciones aritméticas
Estos operadores se centran en asignar el resultado de realizar operaciones aritméticas elementales entre un objeto numérico y el propio objeto donde se va a almacenar el resultado. Todos utilizan:
- "x": un objeto del tipo "A", generalmente numérico.
- "y": un objeto del tipo "B", generalmente numérico.
- Devuelve: el propio objeto de tipo numérico "x".
Igual a la parte entera de ("x:A =/ y:B")
x igual a la parte entera de y
- Acción: equivalente en cuanto a tratamiento físico de los objetos al operador de igualdad. Asigna al objeto "x" de tipo numérico la parte entera del objeto de tipo numérico "y".
Incrementado en ("x:A += y:B")
x incrementado en y
Incrementado en una unidad ("x:A ++")
x incrementado en una unidad
- Acción: suma al valor del objeto "x" una unidad.
Decrementado en ("x -= y")
x decrementado en y
Decrementado en una unidad ("x --")
x decrementado en una unidad
- Acción: resta al valor del objeto "x" una unidad.
Multiplicado con ("x *= y")
x multiplicado con y
Dividido con ("x /= y")
x dividido con y
Elevado con ("x ^= y")
x elevado con y
- Acción: eleva al valor del objeto "x" al exponente "y".
Asignaciones aritméticas utilizando la parte entera
Como se verá con los demás operadores aritméticos, se puede utilizar el operador correspondiente de parte entera para realizar las asignaciones aritméticas:
x +/= y | x -/= y | x */= y | x //= y | x ^/= y
Asignación condicional
Existen operadores de condición que permiten realizar operaciones booleanas sobre objetos booleanos. Estas operaciones se pueden representar también como asignación nuclear añadiendo el símbolo "=" al final del operador doble de condición:
b1 &&= b2 | b1 ||= b2 | b1 ^^= b2
Concatenándole ("v:V &= e:E")
a concatenándole b
- "v": un objeto del tipo conjunto "V".
- "e": un objeto de un tipo "E" compatible con el conjunto de tipo "V".
- Acción: concatena, por el final, añadiendo el objeto "e" al conjunto "v".
- Devuelve: el propio objeto "v" ya modificado.
Operadores aritméticos
Los operadores aritméticos están estandarizados para ser utilizados como interfaz de los objetos de tipo numérico. Son operadores destinados a realizar operaciones entre números o datos que se puedan considerar o tratar como tales.
Aritmética elemental
Estos operadores se centran en las operaciones aritméticas elementales. Todos utilizan:
- "x": un objeto del tipo "A", generalmente numérico.
- "y": un objeto del tipo "B", generalmente numérico.
Más ("x:A + y:B")
x más y
- Devuelve: un nuevo objeto numérico que contenga el valor de sumar "x" con "y".
Menos ("x:A - y:B")
x menos y
- Devuelve: un nuevo objeto numérico que contenga la diferencia de "y" a "x".
Multiplicado por ("x:A * y:B")
x multiplicado por y
- Devuelve: un nuevo objeto numérico que contenga el producto de "x" por "y".
Dividido entre ("x:A / y:B")
x dividido entre y
- Devuelve: un nuevo objeto numérico que contenga el cociente de "x" entre "y". El estándar suele trabajar con precisión infinita, por lo tanto, se suele utilizar internamente una organización en forma de quebrados para no perder la precisión.
Resto de dividir entre ("x:A % y:B")
resto de x dividido entre y
- Devuelve: un nuevo objeto numérico que contenga el resto de la división entera de "x" entre "y".
Elevado a ("x:A ^ y:B")
x elevado a y
- Devuelve: un nuevo objeto numérico que contenga la potencia de base "x" y exponente "y". El estándar suele trabajar con precisión infinita, por lo tanto, se suele utilizar internamente una organización en forma de potencias para no perder la precisión.
Aritmética entera
Generalmente la división entera es una operación que en la informática tradicional se utiliza habitualmente. La idea de las aritmética entera está muy presente en la estandarización de las operaciones aritméticas del Proyecto eWa.
Suma entera con ("x:A +/ y:B")
x suma entera con y
- Devuelve: un nuevo objeto numérico entero que contenga el valor de sumar "x" con "y".
Resta entera con ("x:A -/ y:B")
x resta entera con y
- Devuelve: un nuevo objeto numérico entero que contenga la diferencia de "y" a "x".
Multiplicación entera con ("x:A */ y:B")
x multiplicación entera con y
- Devuelve: un nuevo objeto numérico entero que contenga el producto de "x" por "y".
División entera con ("x:A // y:B")
x división entera con y
- Devuelve: un nuevo objeto numérico entero que contenga el cociente de "x" entre "y".
Potencia entera de ("x:A ^/ y:B")
x potencia entera de y
- Devuelve: un nuevo objeto numérico que contenga la parte entera del valor resultante de elevar la base "x" al exponente "y".
Operadores de comparación
Los operadores de comparación están estandarizados para ofrecer métodos cotidianos para comparar (ordenar, verificar, discriminar...) objetos. Todos ellos devuelven un valor booleano:
Por semejanza
Es igual a ("a:A == b:B")
a es igual a b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el valor booleano cierto (1) si el objeto "A" es igual campo a campo que el objeto "b". Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Es completamente igual a ("a:A === b:B")
a es completamente igual a b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el valor booleano cierto (1) si el objeto "A" es igual campo a campo que el objeto "b" y además es del mismo tipo. Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Es idéntico a ("a:A <==> b:B")
a es idéntico a b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el valor booleano cierto (1) si el objeto "A" es un alias del objeto "b". En caso contrario, devuelve falso.
Inversos
Existen también los operadores de comparación por semejanza inversos. Es decir, aquellos que devuelven cierto cuando su contrario devuelve falso y viceversa. Ambos devuelven undefined en los mismos casos. Su sintaxis es la misma pero cambiando el primer signo igual ("=") por el signo de exclamación ("!"):
a != b | a !=== b | a <!=> b
Por ordenación normal
Es menor que ("a:A << b:B")
a es menor que b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el valor booleano cierto (1) si el objeto "A" es estrictamente menor, campo a campo, que el objeto "b". Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Es menor o igual que ("a:A <= b:B")
a es menor o igual que b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el valor booleano cierto (1) si el objeto "A" es menor o igual, campo a campo, que el objeto "b". Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Es mayor o igual que ("a:A >= b:B")
a es mayor o igual que b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el valor booleano cierto (1) si el objeto "A" es mayor o igual, campo a campo, que el objeto "b". Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Es mayor que ("a:A >> b:B")
a es mayor que b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el valor booleano cierto (1) si el objeto "A" es estrictamente mayor, campo a campo, que el objeto "b". Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Devolviendo extremos
El menor de ("a:A < b:B")
el menor de a y b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el objeto "a" si la operación "a << b" devuelve cierto; si devuelve undefined, este operador devolverá undefined; y en el otro caso, devolverá el objeto "b".
El mayor de ("a:A > b:B")
el mayor de a y b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el objeto "a" si la operación "a >> b" devuelve cierto; si devuelve undefined, este operador devolverá undefined; y en el otro caso, devolverá el objeto "b".
Por ordenación extrema
En ocasiones, se necesita saber si dos valores son muy diferentes. El estándar no marca un valor límite relativo o absoluto a partir del cual dos valores se consideran muy diferentes, pero sí determina que se debe de respetar la siguiente sintaxis:
Es mucho mayor que ("a:A >>> b:B")
a es mucho mayor que b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el valor booleano cierto (1) si el objeto "A" es mucho mayor, campo a campo, que el objeto "b". Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Es mucho menor que ("a:A <<< b:B")
a es mucho menor que b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el valor booleano cierto (1) si el objeto "A" es mucho menor, campo a campo, que el objeto "b". Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Por ordenación aproximada
También, hay veces en las que se necesita saber si dos valores están muy próximos. El estándar no marca un valor límite relativo o absoluto a partir del cual dos valores se consideran muy próximos, pero sí determina que se debe de respetar la siguiente sintaxis:
Es aproximadamente igual ("a:A ~~ b:B")
a es aproximadamente igual que b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el valor booleano cierto (1) si el objeto "A" es aproximadamente igual, campo a campo, que el objeto "b". Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Es aproximadamente mayor que ("a:A >~ b:B")
a es aproximadamente mayor que b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el valor booleano cierto (1) si el objeto "A" es aproximadamente mayor, campo a campo, que el objeto "b". Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Es aproximadamente menor que ("a:A <~ b:B")
a es aproximadamente menor que b
- "a": un objeto del tipo "A".
- "b": un objeto del tipo "B". El tipo "B" puede ser el propio tipo "A".
- Devuelve: el valor booleano cierto (1) si el objeto "A" es aproximadamente menor, campo a campo, que el objeto "b". Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Operadores de condición
Los operadores de condición están estandarizados para realizar operaciones booleanas entre objetos de tipo booleano. Todos ellos devuelven un valor booleano que se puede volver a utilizar.
Hay que tener en cuenta que tanto el operador con un solo "&" o con una sola "^" son diferentes a nivel semántico que los operadores condicionales. Respectivamente sirven para concatenar cadenas y para calcular potencias.
Elementales
No ("! b:B")
b negado; NOT
- "b": un objeto del tipo booleano.
- Devuelve: el valor booleano cierto (1) si ambos el objeto "b" tienen el valor booleano falso. Si el objeto "b" está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Y ("b1:B && b2:B")
b1 y b2; AND
- "b1": un objeto del tipo booleano.
- "b2": un objeto del tipo booleano.
- Devuelve: el valor booleano cierto (1) si ambos objetos tienen el valor booleano cierto. Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
O ("b1:B || b2:B")
b1 o b2; OR
- "b1": un objeto del tipo booleano.
- "b2": un objeto del tipo booleano.
- Devuelve: el valor booleano cierto (1) si al menos uno de los dos objetos tiene el valor booleano cierto. Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
O esclusivo ("b1:B ^^ b2:B")
b1 o esclusivo b2; XOR
- "b1": un objeto del tipo booleano.
- "b2": un objeto del tipo booleano.
- Devuelve: el valor booleano cierto (1) si ambos objetos tienen el valor booleano cierto. Si al menos uno de los dos objetos está definido pero sin inicializar (es un #DEFINED), devuelve undefined. En caso contrario, devuelve falso.
Extensiones
Ejecución condicionada ("b:B ? f:F")
f se ejecuta si b es cierto
- "b": un objeto del tipo booleano.
- "f": una función.
- Devuelve: el valor producido por "f" si el objeto "b" tiene el valor booleano cierto. Si no, devuelve undefiend.
Ejecución bicondicionada ("b:B ? f:F g:F")
f se ejecuta si b es cierto, sino, se ejecuta g; operador ternario
- "b": un objeto del tipo booleano.
- "f": una función.
- "g": una función.
- Devuelve: el valor producido por "f" si el objeto "b" tiene el valor booleano cierto. Si no, devuelve el valor producido por "g".
Operadores vectoriales
Los operadores vectoriales son operadores estándares orientados a facilitar el trabajo con objetos de tipo conjunto.
Elemento de ("v:V[i]")
elemento i-ésimo de v
- "v": un objeto de tipo conjunto "V".
- "i": un objeto de tipo numérico.
- Devuelve: el alias del hueco correspondiente al elemento "i"-ésimo del objeto "v".
Elemento de ("v:V[i,l]")
l elementos de v desde el i-ésimo
- "v": un objeto de tipo conjunto "V".
- "i": un objeto de tipo numérico.
- "l": un objeto de tipo numérico.
- Devuelve: un subconjunto del objeto "v" desde el elemento "i"-ésimo y con "l" elementos como máximo.
Concatenado con ("v:V & w:W")
v concatenado con w