2017-05-05 3 views
0

Existe-t-il un moyen de faire ce travail sans utiliser le repos (j'ai essayé de mettre cdr lst où repos est mais ça me donne une erreur) plus comment puis-je supprimer la condition if - (if (> N 0) - parce que tout ce que je veux afficher à faire est sortie la liste - (liste nE)Remplacement pour le repos dans le régime?

(define (count lst) 
(if (null? lst) '() 
    (let ((display (lambda (N E) 
       (if (> N 0) (list N E) (list N E))))) 
    (let loop ((rest (cdr lst)) 
       (E (car lst)) 
       (N 1)) 
     (cond ((null? rest) 
       (list (display N E))) 
      ((eq? E (car rest)) 
       (loop (cdr rest) E (+ N 1))) 
      (else 
       (cons (display N E) (loop (cdr rest) (car rest) 1)))))))) 
+0

Remarque: Comme 'display' est une fonction intégrée (imprime des valeurs), il semble étrange d'utiliser ce nom à d'autres fins. – soegaard

Répondre

0

de noter que toutes procédures sont tout simplement liés à des variables dans la portée globale Exemple:

(let ((rest 5)) 
    (rest '(1 2 3))) 

?. En R6RS et plus tard, vous devriez obtenir une exception disant que le numéro 5 n'est pas une procédure. La raison en est que vous avez ignoré la liaison rest dans cette étendue et que vous devez utiliser la variable rest comme liaison à 5 et ne pas essayer de l'appeler comme une procédure. Dans R5RS et plus tôt le résultat est indéfini car ce n'est pas un code de schéma valide, mais la plupart des implémentations auront peut-être une erreur similaire à celle que R6RS doit avoir.

Vous avez fait de même avec display mais cette fois display est une procédure qui fait autre chose que le display global. C'est OK dans R6RS mais ce n'est pas bien dans R5RS et plus tôt. Une implémentation est libre de le remplacer par le global pour tous les types supportés. display prend en charge tous les types et ainsi votre code peut ne pas fonctionner dans toutes les implémentations car il est invalide R5RS.

+0

J'ai tout réparé et raccourci le code. Merci –