¿Qué sucede en una cláusula 'cond' del esquema cuando se omite el 'else'?

StackOverflow https://stackoverflow.com/questions/813587

  •  03-07-2019
  •  | 
  •  

Pregunta

Estoy en el proceso de aprender Scheme. Recientemente, pasé (¡demasiado!) Tiempo tratando de encontrar un error en un programa antes de darme cuenta de que me estaba perdiendo la palabra 'else' en una cláusula de cond. Pero el comportamiento en tales circunstancias parece ser un poco extraño. Experimentando las condiciones con un simple programa (a continuación), el 'lo que sea' se muestra como se esperaba en la cláusula else, pero también se muestra, pero sin el 'else', se muestra con las comillas dobles que lo rodean y el nuevo sin interpretar línea impresa literalmente. ¿Alguien puede explicarme qué está pasando? TIA.

   (define (foo x)
    (cond ((eq? x 0) (display "zero\n"))
          (display "whatever\n")))

   (define (bar x)
    (cond ((eq? x 0 ) (display "zero\n"))
          (else (display "whatever\n"))))

In the repl window:
Welcome to DrScheme, version 4.1.5 [3m].
Language: Pretty Big; memory limit: 128 megabytes.
> (foo 0)
zero
> (bar 0)
zero
> (foo 2)
"whatever\n"
> (bar 2)
whatever
> 
¿Fue útil?

Solución

" else " es solo un sinónimo de " true " ;. La forma de leer cond es como una serie de pruebas, donde la primera prueba que es verdadera hace que esa forma sea evaluada.

(cond  ( (test) (do this) )
       ( (test) (do this) ) )

Aquí está tu primera

 (cond ((eq? x 0) (display "zero\n"))
        (display "whatever\n")))

cond mira (eq? x 0) y determina que es falso. La siguiente cláusula es (display " whatever \ n ") . Se ve en display , y como display no es nil , es cierto. Luego evalúa la cadena " cualquiera que sea \ n " , que simplemente se evalúa a sí misma. Por lo tanto, el valor de la cond es " cualquiera que sea \ n " .

Ahora, aquí tienes el segundo:

(cond ((eq? x 0 ) (display "zero\n"))
       (else (display "whatever\n"))))

Aquí, la primera prueba es falsa, y continúa con la segunda, que es else y que se evalúa como verdadera. (Si lo piensa, eso es lo que significa '' else '' en un if-then-else normal: '' verdadero para todos los casos en que ninguna de las pruebas anteriores era verdadera '')

Ahora, el formulario siguiente es (mostrar " lo que sea \ n ") . Esa es una función que envía el argumento de cadena a la consola y no devuelve nada porque eso es lo que la pantalla hace. En otro esquema, podría devolver su valor de cadena, así como imprimirlo, en cuyo caso vería

whatever
"whatever\n"

Otros consejos

En la función foo , la declaración cond evalúa la visualización de como la condición a probar. Como de hecho hay un símbolo llamado display , se evalúa como verdadero, por lo que " lo que sea \ n " se evalúa como el resultado de (foo 2) .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top