No, no hay un operador nor
en ningún lenguaje de programación de alto nivel.
¿Por qué?
Principalmente porque es difícil de leer:
- requiere la combinación mental de varios operadores (" y no ", o en un estilo más literario: " más negativo ", " cada uno falso " )
- implica un
not
implícito en el primer operando, pero el lector solo entiende esto después
- es diferente de los lenguajes humanos, que usan una negación explícita en el primer operando, como " ni x ni y ", " ni x ni y ". Por lo tanto, un lector puede confundir
(x nor y)
con (x and not y)
en lugar de ((not x) and (not y))
- algunos lectores se confunden con el aparente
or
semantic que no se aplica
Pero es tan común en hardware ...
nor
es una puerta de hardware elemental que puede usarse para hacer todas las demás puertas lógicas. Por lo tanto, se podría argumentar que todos los otros operadores lógicos son combinaciones y nor
es el operador lógico elemental más simple.
Sin embargo, lo que es cierto para el hardware no es necesariamente cierto para los humanos. Y a pesar de su popularidad a nivel de hardware, algunas CPU convencionales ni siquiera ofrecen NOR
en su conjunto de instrucciones de ensamblador (por ejemplo, x86 ).
Alternativas
La legibilidad importa. Y a veces se puede mejorar por otros medios.
Uso de operadores existentes
Por ejemplo:
if x not in [1,2] // use of 'in' or 'not in' operator instead of x!=1 and x!=2
Orden de condiciones
if x==1 or x==2
action A
else
action B
en lugar de
if x!=1 and x!=2
action B
else
action A
Uso de hasta loop
Algunos idiomas también ofrecen instrucciones de bucle que permiten expresar condiciones con while
o con until
, permitiéndole elegir la forma más "positiva". Estas instrucciones son, por ejemplo, until c do ...
en ruby , do until c ...
en vb , o repeat ... until c
en pascal y sus descendientes.
Por ejemplo:
Until (x==1 or x==2) do
...
es equivalente a:
While (x!=1 and x!=2)
...
Haz una función
Ahora, si aún prefiere la sintaxis nor
, podría definir una función, pero solo si no espera que ocurra un atajo:
If ( nor(x,y) ) // attention, x and y will always be evaluated
...
Hay una ventaja de legibilidad de la función sobre el operador, porque el lector entiende inmediatamente que la negación se aplica a todos los argumentos. En algunos idiomas puede definir una función con un número variable de argumentos.