En Scheme, ¿`or` y `and` realizan cortocircuito?
¿Hacen and
y or
cortocircuito en Scheme?
A continuación se presentan dos implementaciones de lat?
(lista de átomos). Una utiliza cond
… else
y la otra utiliza or
y and
. Me preguntaba si son equivalentes y la respuesta depende de si or
y and
tienen evaluación de cortocircuito en Scheme.
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
- utiliza
cond
yelse
(define lat?
(lambda (l)
(or (null? l)
(and (atom? (car l))
(lat? (cdr l))))))
- utiliza
or
yand
Creo que or
hace cortocircuito. ¿Por qué? Sé que (car ())
y (cdr ())
producen cada uno Error: Attempt to apply...
. Si or
no hiciera cortocircuito, entonces (lat? ())
eventualmente evaluaría (car ())
y produciría el error. Sin embargo, (lat? ())
no produce el error. Por lo tanto (a través de Modus Tollens), or
hace cortocircuito. ¿Es esto correcto? ¿Y hace and
cortocircuito?
davy.ai
Sí,
and
yor
ambos hacen una evaluación de circuito corto en Scheme. En la implementación delat?
que utilizaor
yand
, si(null? l)
evalúa a#t
, entonces la expresión completa se evalúa como#t
sin evaluar el resto de la expresión. De manera similar, si(null? l)
evalúa a#f
y(atom? (car l))
evalúa a#f
, entonces la expresión completa se evalúa como#f
sin evaluar(lat? (cdr l))
. Por lo tanto, las dos implementaciones son equivalentes.