2010-10-11 7 views
1

La fonction que j'ai écrit pour SICP 2.20 est:Quel est le problème avec mon code de schéma?

(define (same-parity x . y) 
    (if (null? (car y) 
    '() 
    (if (= (even? (car y)) (even? x)) 
    (cons (car y) (same-parity (cons x (cdr y)))) 
    (same-parity (cons x (cdr y)))))) 

Et puis j'essaie de l'appeler avec

(same-parity 1 2 3 4 5 6 7) 

L'erreur que je reçois est: « Le #t objet, passé comme premier argument à integer-equal? ​​n'est pas le bon type. "

Je pensais que des œuvres égales aveC#t et #f ...

Un exemple de code que je trouve est en ligne ce qui suit, je l'ai couru et il fonctionne. Mais qu'est-ce que je fais de mal?

(define (same-parity a . rest) 
    (define (filter rest) 
    (cond ((null? rest) '()) 
      ((= (remainder a 2) (remainder (car rest) 2)) 
      (cons (car rest) (filter (cdr rest)))) 
      (else 
      (filter (cdr rest))))) 
    (filter (cons a rest))) 
+0

vous ne devriez pas donner une liste? (same-parity '(1 2 3 4 5 6 7)) – dutt

+0

J'ai essayé ça, ça n'a pas marché. Pour clarifier, le code que j'ai trouvé comme une solution a fonctionné comme prévu avec l'appel donné. – aeroegnr

Répondre

3

La procédure = accepte les nombres. Mais même? renvoie un booléen et non un nombre.

Utilisez-vous une valeur égale? au lieu de =.

égale? fonctionne avec des booléens.

Par exemple au REPL:

> (even? 2) 
#t 

> (= (even? 2) (even? 2)) 
=: expects type <number> as 1st argument, given: #t; other arguments were: #t 

> (equal? (even? 2) (even? 2)) 
#t 
+0

Merci, cela a résolu le problème principal avec ce peu de code. – aeroegnr