2016-04-14 21 views

Antwort

7

Das Idiom MAPCAR über REMOVE-IF-NOT sein würde, da Sie Elemente behalten wollen, die das Prädikat entsprechen. Die -IF-NOT Funktionen sind veraltet nach dem Standard, aber für Common Lisp Deprecation ist meist bedeutungslos und als solche sehen wir selten jemand COMPLEMENT mit REMOVE-IF verwenden.

Allerdings würden die meisten Menschen ein LOOP hier verwenden:

(lambda (elements test function) 
    (loop 
    for e in elements 
    when (funcall test e) 
     collect (funcall function e))) 

Ein mögliches Problem mit MAPCAR über REMOVE-IF-NOT ist, dass es Speicher für eine temporäre Liste zuweisen wird es einfach nach zu verwerfen. Sie können diese vorzeitige Optimierung nennen, aber wenn ich Funktionen höherer Ordnung (zum Beispiel, weil ich mit generali Sequenzen statt nur Listen arbeiten wollen) verwenden wollte, würde ich MAP-INTO verwenden:

(lambda (elements test function) 
    (let ((tmp (remove-if-not test elements))) 
    (map-into tmp function tmp))) 

1. "Alles, was als veraltet markiert wurde, kann als nicht veraltet angesehen werden, da es keinen anderen Standard geben wird.", R. Strandh (beach).

+2

+1 für die Erwähnung der unterbewerteten ** map-in **. –