Es gibt keine Standardfunktion dafür. Sie könnte man leicht definieren:
(defun reductions (function sequence &rest args
&key key from-end (start 0) end initial-value)
(declare (ignore key from-end start end initial-value))
"Return a list of intermediate values from reducing SEQUENCE with FUNCTION."
(let* ((reductions (list))
(result (apply #'reduce
(lambda (&rest arguments)
(let ((result (apply function arguments)))
(push result reductions)
result))
sequence
args)))
(values (or (nreverse reductions)
(list result))
result)))
(reductions #'+ '(1 2 3 4 5 6 7 8 9 10) :initial-value 0)
;=> (1 3 6 10 15 21 28 36 45 55)
Edit: Verwenden APPLY
mit &REST ARGS
statt REDUCE
direkt aufzurufen. Eine Implementierung von REDUCE
funktioniert möglicherweise nicht, wenn NIL
s für Schlüsselwortargumente bereitgestellt werden.
Edit2: Die reduzierende Funktion kann mit 0 oder 2 Argumenten aufgerufen werden.
Edit3: Wenn REDUCE
mit einer Liste von nur einem Element aufgerufen wird, wird das einzige Element zurückgegeben, wie es ist. Die Reduzierungsfunktion wird überhaupt nicht aufgerufen, was bedeutet, dass die Liste der Reduzierungen leer ist. Ich habe eine OR
hinzugefügt, um das Endergebnis, das in einer Liste in dieser Situation enthalten ist, zurückzugeben (um Clojures-Verhalten zu entsprechen). Ich änderte auch den Code, um das Endergebnis als zweiten Rückgabewert zurückzugeben (möglicherweise nützlich und "warum nicht?").
Beachten Sie, dass die Funktion ** Reduzieren ** von Common Lisp ein paar mehr Glöckchen hat als Clojures. Gemeinsame Lisp's können Sie die Traversierungsreihenfolge angeben (z. B. können Sie von rechts nach links neben dem Standard von links nach rechts gehen), können Sie den Anfangswert weglassen (in diesem Fall das "erste" Element (am weitesten links oder ganz rechts, abhängig auf der Traversierungsordnung) wird als der Anfangswert verwendet, usw. Einige dieser Merkmale machen dies nicht ganz so trivial, wie es sonst scheinen könnte. –
@JoshuaTaylor Großer Punkt, danke. Ich muss mich immer noch an die Common-Lisp-Kultur gewöhnen, indem ich sehr mächtige Optionen in verschiedenen Funktionen eingebaut habe. – zehnpaard
@JoshuaTaylor Sie können den Anfangswert in Clojures 'reduce' weglassen:' (reduzieren + ["whatever"])) => "whatever" '. – Thumbnail