Cosa succede in una clausola "cond" dello Schema quando "else" viene omesso?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Sono in fase di apprendimento dello Schema. Di recente ho trascorso (troppo!) Tempo a cercare un bug in un programma prima di rendermi conto che mi mancava la parola 'else' in una clausola cond. Ma il comportamento in tali circostanze sembra essere un po 'strano. Sperimentando le condizioni con un semplice programma (di seguito) il "qualunque" viene visualizzato come previsto nella clausola else, ma viene anche visualizzato, ma senza "else", viene visualizzato con le doppie virgolette circostanti e il nuovo non interpretato linea stampata letteralmente. Qualcuno può spiegarmi cosa sta succedendo? 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
> 
È stato utile?

Soluzione

" altro " è solo un sinonimo di " true " ;. Il modo di leggere cond è come una serie di test, in cui il primo test vero fa sì che quel modulo venga valutato.

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

Ecco il tuo primo

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

cond esamina (eq? x 0) e determina che è falso. La clausola successiva è (visualizza " qualunque sia \ n ") . Guarda display e poiché display non è zero , è vero. Quindi valuta la stringa " qualunque cosa \ n " , che semplicemente valuta se stessa. Quindi il valore del cond è quindi " qualunque sia \ n " .

Ora, eccoti il ??secondo:

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

Qui, il primo test è falso e passa al secondo, che è else e che restituisce true. (Se ci pensi, questo è ciò che significa "altro" in un normale if-then-else: "vero per tutti i casi in cui nessuno dei test precedenti era vero.")

Ora, il modulo che segue è (visualizza " qualunque sia \ n ") . Questa è una funzione che invia l'argomento stringa alla console e non restituisce nulla perché è ciò che accade al display. In un altro schema, potrebbe restituire il suo valore di stringa e stamparlo, nel qual caso vedresti

whatever
"whatever\n"

Altri suggerimenti

Nella funzione foo , l'istruzione cond valuta display come condizione da testare. Poiché esiste davvero un simbolo chiamato display , viene valutato come vero, quindi il " qualunque cosa \ n " viene quindi valutato come il risultato di (pippo 2) .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top