Question

J'ai essayé d'écrire un (simple, à savoir sans eqan?) fonction one? comme par exemple:

(define one?
  (lambda (n)
    ((= 1 n))))

Mais cette procédure ne fonctionne pas bien parce que quand je l'appelle comme par exemple:

(one? 1)

Je me saluai avec cette erreur:

procedure application: expected procedure, given: #t (no arguments)

La manière correcte (de The Little Schemer ) pour l'écrire est:

(define one?
  (lambda (n)
    (cond
      (else (= 1 n)))))

Pourquoi est-il nécessaire d'utiliser un cond avec une clause else, au lieu de simplement revenir (= 1 n)?

Était-ce utile?

La solution

Il n'y a aucune raison pour laquelle vous voulez faire. Je vais vérifier ma copie de TLS quand je rentre chez moi pour voir si je peux deviner ce qui se passe, mais vous ne manque rien de fondamental sur les cond ou quoi que ce soit.

Réponse à votre note ci-dessus: Il ne fonctionne pas parce que vous avez un ensemble supplémentaire de parenthèses dans le corps du lambda. Il devrait être

(lambda (n) (= 1 n))

Les parenthèses supplémentaires dans votre version signifie qu'au lieu de retourner la valeur #t ou #f, vous essayez d'appeler cette valeur en fonction sans argument.

Autres conseils

ne pas avoir une copie de The Little Schemer à portée de main, votre exemple REVIENT devrait fonctionner. Je pense que la cond est étrangère. Dans psudeo-C le equivant (avec cond) est:

int
one(int n)
{     
    switch (foo) {
        default:
           return  1 == n;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top