De Wikipedia, la enciclopedia libre
  (Redirigido desde Guard (informática) )
Saltar a navegación Saltar a búsqueda

En programación de computadoras, una guardia es una expresión booleana que debe evaluarse como verdadera si la ejecución del programa debe continuar en la rama en cuestión.

Independientemente del lenguaje de programación que se utilice, la cláusula de protección , el código de protección o la declaración de protección es una verificación de las condiciones previas de integridad que se utilizan para evitar errores durante la ejecución. Un ejemplo típico es verificar que una referencia a punto de ser procesada no sea nula, lo que evita fallas de puntero nulo. Otros usos incluyen el uso de un campo booleano para idempotencia (por lo que las llamadas posteriores son nops), como en el patrón de disposición . El guardia proporciona una salida temprana de una subrutina y es una desviación de uso común de la programación estructurada , eliminando un nivel de anidamiento y dando como resultado un código más plano: [1]reemplazando if guard { ... }con if not guard: return; ....

El término se utiliza con un significado específico en los lenguajes de programación APL , Haskell , Clean , Erlang , occam , Promela , OCaml , Swift [2] y Scala . [ cita requerida ] En Mathematica , los guardias se llaman restricciones . Los guardias son el concepto fundamental en Guarded Command Language , un lenguaje en métodos formales . Se pueden usar protectores para aumentar la coincidencia de patronescon la posibilidad de omitir un patrón incluso si la estructura coincide. Las expresiones booleanas en declaraciones condicionales generalmente también se ajustan a esta definición de protección, aunque se denominan condiciones .

En el siguiente ejemplo de Haskell, los guardias ocurren entre cada par de "|" y "=":

f  x  |  x  >  0  =  1  |  de lo contrario  =  0

Esto es similar a la notación matemática respectiva:

En este caso, los guardias están en las cláusulas "si" y "de lo contrario".

Si hay varios resguardos paralelos, como en el ejemplo anterior, normalmente se prueban en un orden de arriba a abajo, y se elige la rama del primero en pasar. Los guardias en una lista de casos suelen ser paralelos.

Sin embargo, en las listas por comprensión de Haskell, los guardias están en serie y, si alguno de ellos falla, el elemento de la lista no se genera. Esto sería lo mismo que combinar los guardias separados con AND lógico , excepto que puede haber otras cláusulas de comprensión de listas entre los guardias.

Evolución [ editar ]

Una expresión condicional simple, ya presente en CPL en 1963, tiene una protección en la primera subexpresión y otra subexpresión para usar en caso de que no se pueda usar la primera. Algunas formas comunes de escribir esto:

(x> 0) -> 1 / x; 0x> 0? 1 / x: 0

Si la segunda subexpresión puede ser una expresión condicional más simple, podemos ofrecer más alternativas para probar antes de la última caída :

(x> 0) -> 1 / x; (x <0) -> -1 / x; 0

En 1966 ISWIM tenía una forma de expresión condicional sin un caso de omisión obligatorio, separando así la guardia del concepto de elegir entre una u otra. En el caso de ISWIM, si no se podía utilizar ninguna de las alternativas, el valor debía ser indefinido , que se definió para que nunca se computara en un valor.

KRC , una "versión miniaturizada" [3] de SASL (1976), fue uno de los primeros lenguajes de programación en utilizar el término "guardia". Las definiciones de sus funciones podrían tener varias cláusulas, y la que se aplicaría se eligió en función de los guardias que siguieron a cada cláusula:

 fac  n  =  1 ,  n  =  0  =  n  *  fac  ( n - 1 ),  n  >  0

El uso de cláusulas de protección, y el término "cláusula de protección", se remonta al menos a la práctica de Smalltalk en la década de 1990, según lo codificó Kent Beck . [1]

En 1996, Dyalog APL adoptó un estilo funcional puro alternativo en el que la protección es la única estructura de control. [4] Este ejemplo, en APL, calcula la paridad del número de entrada:

paridad {  2  :  'impar'  'par'  }

Protector de patrón [ editar ]

Además de un protector adjunto a un patrón, el protector de patrón puede referirse al uso de coincidencia de patrones en el contexto de un protector. En efecto, una coincidencia del patrón se considera que significa pase. Este significado fue introducido en una propuesta para Haskell por Simon Peyton Jones titulada Una nueva visión de los guardias en abril de 1997 y se utilizó en la implementación de la propuesta. La función ofrece la posibilidad de utilizar patrones en las protecciones de un patrón.

Un ejemplo en Haskell extendido:

 torpe  env  var1  var2  |  Solo  val1  <-  lookup  env  var1  ,  Just  val2  <-  lookup  env  var2  =  val1  +  val2  - ... otras ecuaciones para torpe ...

Esto leería: "Torpe para un entorno y dos variables, en caso de que las búsquedas de las variables del entorno produzcan valores , es la suma de los valores ..." Como en las comprensiones de listas , los guardias están en serie, y si cualquiera de ellos falla la rama no se toma.

Ejemplo [ editar ]

public  string  Foo ( string  username )  {  if  ( username  ==  null )  {  lanzar una  nueva  ArgumentNullException ( nameof ( username ));  }  // El resto del código del método sigue aquí ... }

Ver también [ editar ]

  • Afirmación
  • Condicional lógico
  • Declaración de cambio
  • Soporte Iverson
  • Suspensión vigilada

Referencias [ editar ]

  1. ↑ a b Beck, Kent (1997). "Cláusula de guardia". Smalltalk Patrones de mejores prácticas, . págs. 178-179. CS1 maint: discouraged parameter (link)
  2. ^ Cocinero, Nate. "guardar y aplazar" . NSHipster . Consultado el 26 de febrero de 2016 .
  3. ^ Turner, DA "Alguna historia de lenguajes de programación funcionales" (PDF) .
  4. ^ Scholes, John. "Funciones directas en Dyalog APL" (PDF) .

Enlaces externos [ editar ]

  • Guard en Diccionario gratuito en línea de la informática - FOLDOC , Denis Howe (editor).
  • Cláusula de protección , WikiWikiWeb
  • Informe Haskell 98 , capítulo 3 Expresiones .
  • El libro de Mathematica, sección 2.3.5 Poner restricciones a los patrones
  • The Glorious Glasgow Haskell Compilation System User's Guide , Version 6.4, sección 7.3.2. Protectores de patrón