2011-11-05 9 views
6

ho trovato questa domanda sulla funzione speciale "o" nello schema:Perché non posso definire una "o-funzione" nello schema?

Joe Hacker afferma a gran voce che non v'è alcuna ragione o nello Schema ha bisogno di essere speciale - può solo essere definito dal programmatore, così:

(define (or x y) 
    (if x 
     #t 
     y)) 

Joe è giusto?

Non riesco a capire perché non dovrebbe essere possibile farlo.

Potrebbe qualche esperto di schemi spiegare per favore se funziona, e se no: perché no?

+1

Non so quale libro si sta utilizzando per imparare Scheme, quindi ho dovuto andare a [specifica linguaggio Scheme] (http://www.r6rs.org/final/html/r6rs/r6rs-ZH -14.html # node_sec_11.4.5). "Se non ci sono s, viene restituito #f. Altrimenti, le espressioni vengono valutate da sinistra a destra fino a quando uno restituisce un valore val vero (vedere la sezione 5.7) oppure viene raggiunto l'ultimo . Nel primo caso, o espressione restituisce val senza valutare le restanti espressioni.In quest'ultimo caso, viene valutata l'ultima espressione e vengono restituiti i suoi valori. " La funzione 'o' di Joe funziona in questo modo? –

+2

http://www.cs.washington.edu/education/courses/cse341/99wi/scheme/mini-exercises.html –

+1

A proposito, * può * essere definito dal programmatore, ma non come una semplice funzione. Non è speciale per determinati valori speciali. http://www.scheme.com/tspl4/further.html#defn: o – erjiang

risposta

13

È perché questa versione di or valuta tutti i suoi argomenti (poiché è una funzione), mentre lo schema standard or (che non è una funzione ma una sintassi speciale) non lo fa. Prova a eseguire (or #t (exit)) al REPL di schema, quindi prova la stessa cosa con la tua funzione or.

Il comportamento dello standard or viene talvolta chiamato short-circuited: valuta solo quegli argomenti che è necessario. Questo è molto comune per l'operatore booleano binario (or e and) tra i linguaggi di programmazione. Il fatto che orassomigli a una chiamata di funzione è una funzione della sintassi Scheme/Lisp, ma sembra ingannevole.

+0

Questo è tutto! Grazie per la tua spiegazione, questo ha aiutato molto! – Edgar

1

Se funziona o meno dipende da cosa si vuole che faccia. Certamente funziona nel senso che per due valori booleani restituirà il risultato atteso. Tuttavia non sarà funzionalmente equivalente al normale or perché non cortocircuito, cioè data la tua definizione (or #t (/ 0 0)) causerà un errore perché stai dividendo 0 per 0 mentre usi regolare or restituirebbe solo #t e non provare a valutare (/ 0 0) affatto.

+0

Ecco, grazie! – Edgar

Problemi correlati