Common lisp langage est - il un meilleur moyen?
-
09-06-2019 - |
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))
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.