Herramientas de usuario

Herramientas del sitio


es:manual:spsl

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
es:manual:spsl [2023/09/27 12:33] – [Sentencias de prueba simple. Ejecución directa] rootes:manual:spsl [2023/11/16 10:28] (actual) – [@OnError skip / @OnError recover] root
Línea 109: Línea 109:
  
 Si no hay ninguna //sentencia de control// para cambiar el patrón, por defecto se usa el [[es:manual:items:patron:java|patrón Java]] Si no hay ninguna //sentencia de control// para cambiar el patrón, por defecto se usa el [[es:manual:items:patron:java|patrón Java]]
-==== Sentencias de prueba simple. Ejecución directa ====+==== Sentencias de prueba simple. Salida directa ====
  
 La opción mas sencilla son las //sentencias de prueba simples//, en las que no se especifica ninguna condición, sino solamente se escribe la instrucción del sistema operativo tal cuál, es decir: La opción mas sencilla son las //sentencias de prueba simples//, en las que no se especifica ninguna condición, sino solamente se escribe la instrucción del sistema operativo tal cuál, es decir:
Línea 115: Línea 115:
    grep -l function test.txt    grep -l function test.txt
  
-En este caso la sentencia de prueba devolvera a Siette directamente el valor de la ejecución de la instrucción, es decir ''text.txt'', (en el caso de que el fichero contenga la palabra ''function'') o bien la cadena vacía.+En este caso la sentencia de prueba devolverá a Siette directamente el valor que la ejecución de la instrucción devuelva por el flujo de datos de la salida estándar (''stdout''). En este ejemplo la secuencia ''text.txt'', (en el caso de que el fichero contenga la palabra ''function'') o bien la cadena vacía.
  
 ==== Ejecución de una lista de sentencias de prueba ==== ==== Ejecución de una lista de sentencias de prueba ====
Línea 125: Línea 125:
    python3 test.py 1 5 3 4 == False -> Correcto : Incorrecto2    python3 test.py 1 5 3 4 == False -> Correcto : Incorrecto2
  
-Evidntemente en este caso interesa que se ejecuten ambas pruebas. Pueden ocurrir varias situaciones: (1) La primera prueba no da como resultado ''False'' por lo que se devuelve a Siette la cadena ''<!--Incorrecto1-->''; (2) La primera +Evidentemente en este caso interesa que se ejecuten ambas pruebas. Pueden ocurrir varias situaciones: (1) La primera prueba no da como resultado ''False'' por lo que se devuelve a Siette la cadena ''<!--Incorrecto1-->''; (2) La primera 
-prueba se satisface, por lo que el script no termina, sino que continúa ejecutandose. Supongamos que la segunda preuab da un resultado ''True'' cuando debería dar ''False''. La respuesta del sistema a Siette en este caso sería +prueba se satisface, por lo que el script no termina, sino que continúa ejecutandose. Supongamos que la segunda preuba da un resultado ''True'' cuando debería dar ''False''. La respuesta del sistema a Siette en este caso sería 
 ''<!--Incorrecto1-->''; (3) Supongamos que la primera prueba se cumple y la segunda tambien. En este caso la respuesta que devuelve a Siette será ''<!--Correcto-->''. En realidad, este script podria sustituirse por este otro mas simple: ''<!--Incorrecto1-->''; (3) Supongamos que la primera prueba se cumple y la segunda tambien. En este caso la respuesta que devuelve a Siette será ''<!--Correcto-->''. En realidad, este script podria sustituirse por este otro mas simple:
  
Línea 134: Línea 134:
  
 si no es necesario diferenciar entre uno u otro caso.  si no es necesario diferenciar entre uno u otro caso. 
 +
 +==== @Answer label ====
 +Cuando se trata de preguntas simples, Siette solo espera una respuesta tras la ejecución del script de verificación del fichero. Ahora bien, en el caso de preguntas compuestas, es necesario devolver una respuesta por cada una de las subpreguntas.
 +
 +Cuando se usan preguntas compuestas con fichero, el script correspondiente a la pregunta compuesta se obtiene mediante la concatenación de los scripts de cada una de las subpreguntas. La etiqeuta ''@Answer'' se usa para de separar cada uno los trozos de script pertenecientes a cada una de las subpreguntas.
 +
 +Este proceso es transparente al usuario, ya que al construir la pregunta externa de fichero, si se trata de una pregunta compuesta, Siette se preocupa de añadir para cada una de las subpreguntas la opción ''@Answer label'' correspondiente, de manera que cuando el script de procesamiento termina, ya sepa como comunicar la respuesta. 
 +
 +Podriamos decir que la sentencia ''@Answer'' es un sentencia de control del sistema, ya que el usuario normalmente no tiene que usarla.
  
 ==== @OnError stop ==== ==== @OnError stop ====
  
-El modo descrito anteriormente es el comportamiento por defecto, que viene definido por la //sentencia de control// ''@OnError stop'', cuyo funcionamiento general es el siguiente:+El modo descrito en los ejemplo anteriores es el comportamiento por defecto, que viene definido por la //sentencia de control// ''@OnError stop'', cuyo funcionamiento general es el siguiente:
  
 Supongamos un conjunto de sentencias de prueba Supongamos un conjunto de sentencias de prueba
Línea 179: Línea 188:
  
  
-==== @OnError skip ==== +==== @OnError skip / @OnError recover ==== 
-Esta //sentencia de control// se usa en combinación con la //sentencia de control// ''@Answer'' en las [[es:manual:items:externosficherocompuestas|preguntas compuestas con fichero]]. Cuando en un script se establece el modo ''@OnError skip'', si se produce un error en la ejecución de alguna de las //sentencias de prueba// el script no se interrumpe, sino que el flujo de control se reinicia y salta hasta encontrar la siguiente instrucción ''@Answer''. Por ejemplo, supongamos el siguiente script:+Esta //sentencia de control// se usa en combinación con la //sentencia de control// ''@OnError recover''. Cuando en un script se establece el modo ''@OnError skip'', si se produce un error en la ejecución de alguna de las //sentencias de prueba// el script no se interrumpe, sino que el flujo de control se reinicia y salta hasta encontrar la siguiente instrucción ''@OnError recover''. Por ejemplo, supongamos el siguiente script:
  
     @OnError skip     @OnError skip
 +    instr1        == res1   -> A1   : B1
 +    instr2        == res2   -> A2   : B2
 +    instr3        == res3   -> A3   : B3
 +    @OnError recover 
 +    instr4        == res4   -> A4   : B4
 +    instr5        == res5   -> A5   : B5
 +    @OnError recover 
 +    instr6        == res6   -> A6   : B6
 +    instr7        == res7   -> A7   : B7
 +   ...
 +
 +La ejecución comienza lanzando la instrucción instr<sub>1</sub>. Si la ejecución de instr<sub>1</sub> da como resultado res<sub>1</sub> el script de ejecución continúa con la instrucción instr<sub>2</sub>; pero si el resultado de la ejecución de instr<sub>1</sub> no es el esperado, las instrucciones siguientes instr<sub>2</sub> y instr<sub>3</sub> no se ejecutarán. Al encontrar la //sentencia de control// ''@OnError recover'', el proceso se recupera, ejecutando ahora la instrucción instr<sub>4</sub>. Nuevamente si esta instrucción da un resultado correcto, el proceso seguirá con la instrucción siguiente, pero si la ejecución de 
 +instr<sub>4</sub> da error, la siguiente instrucción a ejecutar será instr<sub>6</sub>.
 +
 +Nótese que la //sentencia de control// ''@OnError recover'' no tendría ningún efecto si previamente no es hubiera establecido la //sentencia de control// ''@OnError skip''.
 +
 +=== Preguntas compuestas ===
 +
 +Un caso especial y muy frecuente del uso de estas //sentencias de control// es la ejecución de [[es:manual:items:externosficherocompuestas|preguntas compuestas con fichero]]. Siette compone el script de ejecución añadiendo en la cabecera de cada subpregunta dos //sentencias de control//, una de tipo ''@Answer label'' y otra ''@OnError recover'', por lo que solo sería necesario definir manualmente la //sentencia de control//  ''@OnError skip''. En este caso, no es necesario incluir manualmente ''@OnError recover'' ya que se añade automáticamente. El salto en la ejecución funcionará entre los (sub)scripts de las subpreguntas. Por ejemplo, supongamos que Siette ha compuesto el siguiente script:
 +
 +    @OnError skip
 +    instr(0,1)        == res(0,1)   -> A(0,1)   : B(0,1)
 +    ...
 +   
     @Answer label(1)      @Answer label(1) 
 +    @OnError recover 
     instr(1,1)        == res(1,1)   -> A(1,1)   : B(1,1)     instr(1,1)        == res(1,1)   -> A(1,1)   : B(1,1)
     instr(1,2)        == res(2)     -> A(2)     : B(1,2)     instr(1,2)        == res(2)     -> A(2)     : B(1,2)
Línea 193: Línea 227:
          
     @Answer label(2)      @Answer label(2) 
 +    @OnError recover 
     instr(2,1)        == res(2,1)   -> A(2,1)   : B(2,1)     instr(2,1)        == res(2,1)   -> A(2,1)   : B(2,1)
     instr(2,2)        == res(2)     -> A(2)     : B(2,2)     instr(2,2)        == res(2)     -> A(2)     : B(2,2)
Línea 202: Línea 237:
          
     @Answer label(3)      @Answer label(3) 
 +    @OnError recover 
     instr(3,1)        == res(3,1)   -> A(3,1)   : B(3,1)     instr(3,1)        == res(3,1)   -> A(3,1)   : B(3,1)
     ...     ...
  
 +Si suponemos que las //sentencias de pruebas// fallan en la prueba instr<sub>1,j</sub> == res<sub>1,j</sub>, la ejecución saltara a la prueba instr<sub>2,1</sub> == res<sub>2,1</sub>. Si suponemos que  a partir de aquí todas las pruebas funcionan hasta la prueba instr<sub>2,k</sub> == res<sub>2,k</sub>, el flujo de control volverá a saltar hasta la siguiente instrucción ''OnError recover'' situada justo detrás de @Answer label<sub>3</sub>, es decir a la prueba instr<sub>3,1</sub> == res<sub>3,1</sub>, y así sucesivamente.
  
-Si suponemos que las //sentencias de pruebas// fallan en la prueba instr<sub>1,j</sub> == res<sub>1,j</sub>, la ejecución saltara a la prueba instr<sub>2,1</sub> == res<sub>2,1</sub>. Si suponemos que  a partir de aquí todas las pruebas funcionan hasta la prueba instr<sub>2,k</sub> == res<sub>2,k</sub>, el flujo de control volverá a saltar hasta la instrucción siguiente a @Answer label<sub>3</sub>, es decir a la prueba instr<sub>3,1</sub> == res<sub>3,1</sub>, y así sucesivamente.+La instrucción ''@Answer label'' devuelve en cada caso la etiqueta correspondiente al subscript que comienza a partir de esta sentencia, es decir, en el supuesto anterior, la pregunta externa de fichero devolverá a Siette el valor de la etiqueta B<sub>1,j</sub> (y si no existe esta etiqueta A<sub>1,j-1</sub>, y si no el anterior, y así sucesivamente), en el parámetro label<sub>1</sub>; y B<sub>1,k</sub> (o en su defecto la etiqueta que corresponda)como valor del parámetro label<sub>2</sub>.
  
-Además de producirse el salto, la instrucción ''@Answer label'' devuelve en cada caso la etiqueta correspondiente al subscript que comienza a partir de esta sentencia, es decir, en el supuesto anterior, la pregunta externa de fichero devolverá a Siette el valor de la etiqueta B<sub>1,j</sub> (y si no existe esta etiqueta A<sub>1,j-1</sub>, y si no el anterior, y asi sucesivamente), en el parámetro label<sub>1</sub>; y B<sub>1,k</sub> (o en su defecto la etiqueta que corresponda), como valor del parámetro label<sub>2</sub>. 
- 
-==== @Answer label ==== 
-Cuando se trata de preguntas simples, Siette solo espera una respuesta tras la ejecución del script de verificación del fichero. Ahora bien, en el caso de preguntas compuestas, es necesario devolver una respuesta por cada una de las subpreguntas. 
- 
-Cuando se usan preguntas compuestas con fichero, el script correspondiente a la pregunta compuesta se obtiene mediante la concatenación de los scripts de cada una de las subpreguntas. La etiqeuta ''@Answer'' se usa para de separar cada uno los trozos de script pertenecientes a cada una de las subpreguntas. 
- 
-Este proceso es transparente al usuario, ya que al construir la pregunta externa de fichero, si se trata de una pregunta compuesta, Siette se preocupa de añadir para cada una de las subpreguntas la opción ''@Answer label'' correspondiente, de manera que cuando el script de procesamiento termina, ya sepa como comunicar la respuesta.  
- 
-Podriamos decir que la sentencia ''@Answer'' es un sentencia de control del sistema, ya que el usuario normalmente no tiene que usarla. 
      
  
 ==== @Eval add all ==== ==== @Eval add all ====
-Esta sentencia de control indica que cuando se devuelve un valo a Siette se deben //sumar// todas las etiquetas que se hayan producido, y no solamente utilizar la última. Evidentemente esto solo puede hacerse si las etiquetas tienen un valor numérico. Si no lo tienen o no se han escrito etiquetas en la //sentencia de prueba//, se tomara como valor 0.+Esta sentencia de control indica que cuando se devuelve un valor a Siette se deben //sumar// todas las etiquetas que se hayan producido, y no solamente utilizar la última. Evidentemente esto solo puede hacerse si las etiquetas tienen un valor numérico. Si no lo tienen o no se han escrito etiquetas en la //sentencia de prueba//, se tomara como valor 0.
  
-Por ejemplo, supongamos que se quiere comprobar si un programa en [[wp>Python]] es capaz de reconocer los numeros impares. El script podria ser el siguiente:+Por ejemplo, supongamos que se quiere comprobar si un programa en [[wp>Python]] es capaz de reconocer los numeros impares. El script podría ser el siguiente:
  
    @OnError continue    @OnError continue
es/manual/spsl.1695818031.txt.gz · Última modificación: 2023/09/27 12:33 por root

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki