Cosa succede in una clausola "cond" dello Schema quando "else" viene omesso?
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
>
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)
.