Was ist der praktische Zweck von clojures dynamischen Vars und Binding?

8

Ich habe mir die Referenzen angesehen: Ссылка , Ссылка

sowie clojure und ^: dynamic und Dynamische Bindung von Clojure

Ich verstehe immer noch nicht, warum binding überhaupt gebraucht wird, da jedes Programm, das ich geschrieben habe, ohne sie war und ich Wege finden kann, die Beispiele konventionell zu schreiben - was ich verständlicher finde. Gibt es Beispiele von Projekten / Programmierparadigmen, die davon Gebrauch machen?

zum Beispiel ... im Tier sprechen Sie beispielsweise einen ähnlichen Effekt mit:

%Vor%

keine Makros, keine dynamische Bindung ... immer noch sehr sauber.

    
zcaudate 17.10.2012, 10:42
quelle

2 Antworten

11

Es gibt nicht strikt eine Notwendigkeit für sie: wie Sie richtig beobachten, können Sie tun, was Sie wollen, ohne binding , und tatsächlich, wenn binding nicht existierte, könnten Sie Implementieren Sie es relativ einfach mit Makros und Javas ThreadLocal s.

Die Bindung ist jedoch nützlich, um dynamischer Kontext an eine Funktion zu übergeben, ohne einen Parameter explizit übergeben zu müssen.

Dies ist besonders nützlich, wenn Sie tief verschachtelte Funktionen höherer Ordnung verfassen und keine zusätzlichen Parameter zu jeder einzelnen Funktion im Aufruf-Stack hinzufügen möchten, um einen Wert an die tieferen Funktionen zu übergeben, die tief in ihnen eingebettet sind. p>

Um an Ihrem Beispiel aufzubauen:

%Vor%

Hinweis: Ich musste der Funktion speak keinen zusätzlichen Parameter hinzufügen, um ein anderes Verhalten zu erhalten. Das Hinzufügen eines zusätzlichen Parameters wäre in diesem Fall trivial, aber stellen Sie sich vor, wenn die Funktion speak tief in einer komplexen Funktion höherer Ordnung vergraben wäre .....

Dennoch denke ich, dass der beste Rat überhaupt darin besteht, eine dynamische Bindung zu vermeiden, es sei denn, Sie brauchen sie wirklich. In der Regel ist es besser, explizite Parameter hinzuzufügen, wenn Sie Folgendes tun können: Direkte Parameter erleichtern das Testen und Begründen von Funktionen.

    
mikera 17.10.2012, 12:27
quelle
1

Ich folge nur weiter oben auf mikers Beispiel. Ich kann sehen, warum du es in einer weniger ausdrucksstarken Sprache machst, aber weil clojure so ausdrucksstark ist, würde ich es lieber umschreiben ... Die loud-noise Funktion kann leicht verändert werden, Um den gleichen Effekt zu erreichen, fügen Sie zusätzliche Parameter hinzu, um zu sprechen ...

%Vor%

Ist die Bindung nur eine Möglichkeit, eine schnelle und schmutzige Lösung zu hacken, wenn Sie den ursprünglichen Code nicht ändern können?

    
zcaudate 18.10.2012 00:36
quelle

Tags und Links