Clojure-Stil (und gute Software-Entwicklung im Allgemeinen) legt Wert auf viele kleine Funktionen, von denen eine Teilmenge öffentlich sichtbar ist, um eine externe Schnittstelle zur Verfügung zu stellen.Clojure style: defn vs. leftn
In Clojure scheint es ein paar Möglichkeiten, dies zu tun:
(letfn [(private-a ...)
(private-b ...)]
(defn public-a ...)
(defn public-b ...))
(defn- private-a ...)
(defn- private-b ...)
(defn public-a ...)
(defn public-b ...)
Die letfn Form ausführlicher und vielleicht weniger flexibel scheint, aber es reduziert den Umfang der Funktionen.
Meine Vermutung ist, dass Letfn nur für den Einsatz in anderen Formen gedacht ist, wenn kleine Hilfsfunktionen nur in einem kleinen Bereich verwendet werden. Ist das der Konsens? Sollte ich jemals auf einer Top-Level verwendet werden (wie ich zuvor empfohlen habe)? Wann sollte es verwendet werden?
Fühlst du, dass "Letfn" generell nicht für Hilfsfunktionen geeignet ist - man benutze user2494739 - aber nur für gegenseitige Rekursion? Ich habe kein Gespür dafür, was üblicherweise mit "leftn" gemacht wird, also mag ich eigensinnig sein, aber ich definiere oft Hilfsfunktionen mit 'leftn' oder manchmal' (let [f (fn [x] ...)). ..] 'zu vermeiden,' Let' und 'Letfn' zusammen zu verwenden. – Mars
Ich denke mit' letfn' oder '(lass [f (fn [x] ...' so ist gut. Ich mache das die ganze Zeit selbst Es reduziert die Anzahl der Funktionen, die Sie auf der obersten Ebene definiert haben, was ich für eine gute Sache halte. –
Um zu verdeutlichen, benutze ich 'leftn' * innerhalb * a' defn'. Etwas wie '(defn top-level-fn [xs] (letfn [(helfer [y] (do-something-withy))] (map helper xs)))' –