Manchmal habe ich es in Clojure als bequem empfunden, reduzierte Arity-Versionen von Funktionen zu definieren, die eine Teilfunktion, z. DieseDefinieren von Partialfunktionen mit reduzierter Arit
(defn prefix
([pre string]
(str pre ":" string))
([pre]
(fn [string]
(prefix pre string))))
bedeutet, dass Sie tun können, entweder:
(prefix "foo" 78979)
=> "foo:78979"
((prefix "foo") 78979)
=> "foo:78979"
Dies scheint ziemlich Haskell-ish und vermeidet die Notwendigkeit partial
zu schaffen Teilfunktionen.
Aber ist es in Lisp gute Codierungsstil/API-Design?
Das ist currying, ja? Scheint nützlich zu sein. Und ich denke, dass die Schnittstelle hier verbessert werden könnte. Es wäre schön, wenn Sie diese Technik generisch machen könnten; Das heißt, bei Funktionen mit allen Schlüsselwörtern wird beim Aufrufen dieser Funktion mit einem unvollständigen Satz von Schlüsselwörtern ein Abschluss zurückgegeben, der alle verbleibenden Schlüsselwörter akzeptiert. Wenn alle Schlüsselwörter verbraucht sind, erhalten Sie den Wert der Funktion. Ich könnte sehen, dass dies als eine Optimierungstechnik verwendet wird. –
Ich denke, es ist immer noch ideomatisch, wenn Sie Ihre Partials für die Lesbarkeit benennen, wenn Sie sie so definieren: (def Präfix (partiell ...)) Also hat dies beides: Ein Name zu verweisen und es ist explizit.Beachten Sie, dass Sie defn jetzt nicht verwenden, def-partially aber die Funktion für Sie erstellt. – KIMA