2009-05-01 13 views
8

Sono in procinto di apprendere lo schema. Recentemente ho passato (troppo!) Tempo a cercare un bug in un programma prima di rendermi conto che mancava la parola 'else' in una clausola cond. Ma il comportamento in tali circostanze sembra essere un po 'strano. Sperimentando con le condizioni con un semplice programma (sotto) il 'qualunque' viene visualizzato come previsto nella clausola else, ma viene anche visualizzato, ma senza il 'else', viene visualizzato con le virgolette circostanti e il nuovo non interpretato linea stampata letteralmente. Qualcuno può spiegarmi cosa sta succedendo? TIA.Cosa succede in una clausola 'cond' di Scheme quando il 'else' è omesso?

(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 
> 

risposta

16

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

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

Ecco la tua prima

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

cond guarda (eq? x 0) e determinato che è falso. La prossima clausola è (display "whatever\n"). Guarda display e dal display non è nil, è vero. Quindi valuta la stringa "whatever\n", che valuta semplicemente se stessa. Quindi il valore del cond è quindi "whatever\n".

Ora, qui si è seconda:

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

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

Ora, il modulo seguente è (display "whatever\n"). Questa è una funzione che invia l'argomento della stringa alla console e non restituisce nulla perché è ciò che accade alla visualizzazione. In un altro schema, potrebbe restituire il suo valore di stringa così come stamparlo, nel qual caso vedresti

whatever 
"whatever\n" 
+1

In realtà, almeno nello Schema R5RS, 'else' non è un sinonimo di true. È solo un identificatore riconosciuto dalla macro. –

+1

che operativamente è ancora sinonimo di vero. –

9

Nella funzione foo, la dichiarazione viene valutata conddisplay come la condizione da verificare. Poiché esiste effettivamente un simbolo denominato display, viene valutato true, pertanto lo "whatever\n" viene valutato come risultato di (foo 2).

+0

La tua risposta è stata meravigliosamente chiara e altrettanto meritevole di risposta accettata. L'ho dato a Charlie per tutta la sua battitura. Grazie mille. – Leonard

+0

Nessun problema, se lo merita! –

+0

Beh, ti ho revocato comunque, Greg. –

Problemi correlati