Esquema: ¿Por qué existe la necesidad de utilizar un cond aquí?
-
21-09-2019 - |
Pregunta
I tratado de escribir una (simple, es decir, sin eqan?
) función one?
como tales:
(define one?
(lambda (n)
((= 1 n))))
Sin embargo, el anterior no funciona, porque aunque cuando lo llamo como por ejemplo:
(one? 1)
I Get recibido con este error:
procedure application: expected procedure, given: #t (no arguments)
La forma correcta (de The Little Schemer ) para escribir es:
(define one?
(lambda (n)
(cond
(else (= 1 n)))))
¿Por qué hay una necesidad de utilizar un cond
con una cláusula else
, en lugar de (= 1 n)
que acaban de volver?
Solución
No hay ninguna razón por la que se quiere hacer eso. Voy a revisar mi copia de TLS cuando llegue a casa para ver si puedo adivinar lo que está pasando, pero no se está perdiendo algo fundamental acerca de cond
ni nada.
Respuesta a la nota anterior: No está funcionando porque tiene un conjunto adicional de paréntesis en el cuerpo de la lambda. Debe ser
(lambda (n) (= 1 n))
Los paréntesis adicionales en su versión media que en lugar de devolver el valor o #t
#f
, que está tratando de llamar a ese valor como una función sin argumentos.
Otros consejos
no tener una copia de The Little Schemer a mano, tu ejemplo parece que debería funcionar. Creo que el cond
es extraña. En psudeo-C la equivant (con cond) es:
int
one(int n)
{
switch (foo) {
default:
return 1 == n;
}
}