Frage

Ich ertappe mich dabei, dass ich so etwas ständig mache.Ich habe darüber nachgedacht, ein Makro/eine Funktion zu schreiben, um so etwas einfacher zu machen, aber mir kommt der Gedanke, dass ich wahrscheinlich das Rad neu erfinde.

Gibt es eine Funktion, mit der ich die gleiche Sache prägnanter erledigen kann?

(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))  
War es hilfreich?

Lösung

Es gibt mehrere integrierte Möglichkeiten, dies zu tun.Eine Möglichkeit wäre:

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

Und ein anderer:

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

Und noch eins:

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

Usw...Es gibt auch SERIE Und Iterieren.Die Iterate-Version ist identisch mit der LOOP-Version, interessant ist jedoch die SERIES-Version:

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

Also, ja, es ist sehr wahrscheinlich, dass Sie sich neu erfinden manche Rad.:-)

Andere Tipps

Die gewünschte Funktion ist remove-if-not, das eingebaut ist.

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

Wenn Sie das Gefühl haben, dass Sie etwas im Zusammenhang mit Listen neu erfinden, dann ist das wahrscheinlich der Fall.Überprüfen Sie die Hyperspec, um zu sehen.

Es gibt mehrere Möglichkeiten, dies zu tun.Erstens und wahrscheinlich am einfachsten: Sie können es rekursiv tun.

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

Man könnte es auch mit machen mapcar Und reduce, wobei Ersteres Ihnen eine Liste mit fehlerhaften Elementen erstellen kann, die durch ersetzt werden nil und letzteres kann zum Herausfiltern verwendet werden nil.

Beides wäre ein guter Kandidat für ein „Filter“-Makro oder eine Funktion, die eine Liste übernimmt und die Liste gefiltert nach einem Prädikat zurückgibt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top