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?

¿Fue útil?

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;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top