Question

Je me retrouve à faire ce genre de chose tout le temps.J'ai été envisagent l'écriture d'une macro/fonction pour faire ce genre de chose plus facile, mais il me semble que je suis probablement en train de réinventer la roue.

Y a t il une fonction qui me permettra de réaliser ce même genre de chose de façon plus succincte?

(defun remove-low-words (word-list)   
  "Return a list with words of insufficient score removed."
  (let ((result nil))
    (dolist (word word-list)  
      (when (good-enough-score-p word) (push word result)))                                      
    result))  
Était-ce utile?

La solution

Il y a plusieurs façons de le faire.Un autre moyen serait:

(remove-if-not 'good-enough-score-p word-list)

Et un autre:

(loop for word in word-list  
      when (good-enough-score-p word)
      collect word)

Et encore un autre:

(mapcan (lambda (word)
          (when (good-enough-score-p word)
            (list word)))
        word-list)

Etc...Il y a aussi SÉRIE et Itérer.L'Itération de la version est identique à la BOUCLE de la version, mais la version de SÉRIE est intéressante:

(collect (choose-if 'good-enough-score-p (scan word-list))))

Donc, oui, vous êtes très probablement à réinventer certains la roue.:-)

Autres conseils

La fonction que vous voulez est remove-if-not, qui est intégré.

(defun remove-low-words (word-list)
  (remove-if-not #'good-enough-score-p word-list))

Si vous vous sentez comme vous êtes ré-inventer quelque chose à faire avec les listes, vous êtes probablement.Vérifier l'Hyperspec à voir.

Il ya quelques façons dont vous pouvez faire cette.Tout d'abord, et probablement le plus facilement, vous pouvez le faire de manière récursive.

(defun remove-low-words (word-list)
  (if (good-enough-score-p (car word-list))
      (list word (remove-low-words (cdr word-list)))
      (remove-low-words (cdr word-list))))

Vous pouvez aussi le faire avec mapcar et reduce, lorsque l'ancien peut construire la liste à défaut d'éléments remplacé par nil et ce dernier peut être utilisé pour filtrer les nil.

Soit un bon candidat pour un "filtre" macro ou une fonction qui prend une liste et retourne la liste filtrée par certains de prédicat.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top