Pregunta

Me encuentro haciendo este tipo de cosas todo el tiempo.He estado considerando escribir una macro/función para facilitar este tipo de cosas, pero se me ocurre que probablemente esté reinventando la rueda.

¿Existe alguna función que me permita lograr este mismo tipo de cosas de manera más sucinta?

(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))  
¿Fue útil?

Solución

Hay varias formas integradas de hacer esto.Una forma sería:

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

Y otro:

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

Y otro más:

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

Etc...También hay SERIE y Iterar.La versión Iterate es idéntica a la versión LOOP, pero la versión SERIES es interesante:

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

Entonces, sí, es muy probable que reinventes alguno rueda.:-)

Otros consejos

La función que quieres es remove-if-not, que está incorporado.

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

Si siente que está reinventando algo que tiene que ver con las listas, probablemente lo esté.Consulte Hyperspec para ver.

Hay un par de formas de hacer esto.En primer lugar, y probablemente más fácilmente, puedes hacerlo de forma recursiva.

(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))))

También podrías hacerlo con mapcar y reduce, donde el primero puede construirle una lista con elementos defectuosos reemplazados por nil y este último se puede utilizar para filtrar el nil.

Cualquiera de los dos sería un buen candidato para una macro o función de "filtro" que toma una lista y la devuelve filtrada por algún predicado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top