setq
gibt den Wert zurück, so dass Sie einfach:
(setq f-loc1 (setq f-loc2 "/foo/bar"))
Wenn Sie sich nicht darauf verlassen möchten, verwenden Sie:
(setq f-loc1 "/foo/bar" f-loc2 f-loc1)
Persönlich würde ich letzteres vermeiden und stattdessen schreiben:
(setq f-loc1 "/foo/bar"
f-loc2 f-loc1)
oder auch
(setq f-loc1 "/foo/bar")
(setq f-loc2 f-loc1)
Und der allererste Ansatz würde ich nur in ganz besonderen Situationen anwenden, in denen er tatsächlich die Absicht betont , oder wenn die Alternative darin besteht, den zweiten Ansatz zu verwenden, oder sonst progn
.
Sie können hier aufhören zu lesen, wenn das oben Genannte Sie glücklich macht. Aber ich denke, dies ist eine gute Gelegenheit, Sie und andere zu warnen, Makros nicht zu missbrauchen.
Auch wenn es verlockend ist, ein Makro wie setq-every
"weil das lispelt und wir es können" zu schreiben , würde ich dringend empfehlen, dies nicht zu tun. Sie gewinnen sehr wenig, indem Sie es tun:
(setq-every value a b)
vs
(setq a (setq b value))
Gleichzeitig erschweren Sie anderen Lesern das Lesen des Codes und stellen sicher, was passiert. setq-every
Es kann auf verschiedene Arten implementiert werden, und andere Benutzer (einschließlich einer Zukunft, für die Sie sich entschieden haben) können nicht wissen, für welche sie sich entscheiden. [Ursprünglich habe ich hier einige Beispiele angeführt, aber diese wurden von jemandem als sarkastisch und beschimpft angesehen.]
Sie können mit diesem mentalen Overhead jedes Mal umgehen, wenn Sie es sich ansehen, setq-every
oder Sie können nur mit einem einzigen zusätzlichen Charakter leben. (Zumindest für den Fall, dass Sie nur zwei Variablen setzen müssen, aber ich kann mich nicht erinnern, dass ich jemals mehr als zwei Variablen auf einmal auf den gleichen Wert setzen musste. Wenn Sie das tun müssen, ist wahrscheinlich etwas anderes falsch mit deinem Code.)
Wenn Sie dieses Makro jedoch tatsächlich mehr als ein halbes Dutzend Mal verwenden, ist die zusätzliche Indirektion möglicherweise die Mühe wert. Zum Beispiel verwende ich Makros wie --when-let
aus der dash.el
Bibliothek. Das macht es denjenigen schwerer, die zum ersten Mal in meinem Code darauf stoßen, aber es lohnt sich, diese Verständnisschwierigkeiten zu überwinden, da der Code mehr als nur ein paar Mal verwendet wird und zumindest meiner Meinung nach besser lesbar ist .
Man könnte argumentieren, dass das Gleiche gilt setq-every
, aber ich denke, dass es sehr unwahrscheinlich ist, dass dieses spezielle Makro mehr als ein paar Mal verwendet wird. Eine gute Faustregel ist, dass, wenn die Definition des Makros (einschließlich der doc-Zeichenfolge) mehr Code hinzufügt als die Verwendung des Makros entfernt, das Makro sehr wahrscheinlich überfordert ist (das Gegenteil ist jedoch nicht unbedingt der Fall).