@ Ben: Es ist nicht der Setf-Aufruf, der falsch ist - das Problem ist, dass er xs nicht aktualisiert.
Dh: xst wird auf xs gesetzt, wenn das Element entfernt ist, aber xs wird nicht aktualisiert. Wenn ein zweites Element entfernt werden soll, hat xst das erste zurück.
müssten Sie xst an xs binden und ersetzen Sie die xs im Aufruf entfernen mit xst. Dies würde dann alle Elemente entfernen, die größer als x sind. dh:
(defun biggerElems(x xs)
(let ((xst xs))
(dolist (elem xs)
(when (> x elem)
(setf xst (remove elem xst))))
xst))
Es könnte etwas schneller sein zu setzen xst zu (copy-Liste xs) und dann statt entfernen verwenden löschen (löschen destruktiv ist ... je nach Implementierung kann es schneller sein als entfernen. Da Sie dies mehrmals aufrufen, erhalten Sie möglicherweise eine bessere Leistung, indem Sie die Liste einmal kopieren und löschen.
Alternativ:
(defun bigger-elems (x xs) ; I prefer hyphen separated to camelCase... to each his own
(loop for elem in xs when (<= x elem) collect elem))
zurück über Ihre ursprüngliche Post Sehen, es ist ein wenig verwirrend ist ... Sie sagen, Sie alle Elemente entfernen größer als x, aber Ihr Code sieht aus wie es alle Elemente zu entfernen versucht, x ist größer als. Die Lösungen, die ich geschrieben habe, geben alle Elemente zurück, die größer als x sind (dh: entferne alle Elemente, die größer als x sind).
Nur weil Sie Rekursion in Lisp verwenden können, bedeutet das nicht, dass es der "Lisp Way" ist. Es gibt mehrere Mechanismen, um dies in Lisp zu tun (wie an anderer Stelle hier zu sehen), und alle von ihnen sind idiomatisch. Die rekursive Methode ist einfach die einfachste. –