setq
повертає значення, тож ви можете просто:
(setq f-loc1 (setq f-loc2 "/foo/bar"))
Якщо ви не хочете покладатися на це, тоді використовуйте:
(setq f-loc1 "/foo/bar" f-loc2 f-loc1)
Особисто я би уникав останнього і замість цього писав:
(setq f-loc1 "/foo/bar"
f-loc2 f-loc1)
або навіть
(setq f-loc1 "/foo/bar")
(setq f-loc2 f-loc1)
І найперший підхід я застосував би лише у досить особливих обставинах, коли він насправді наголошує на намірі, або коли альтернативою буде використання другого підходу progn
.
Ви можете перестати читати тут, якщо вищезгадане робить вас щасливим. Але я думаю, що це хороша можливість попередити вас та інших, щоб не зловживати макросами.
Нарешті, хоча спокушати писати макрос на кшталт setq-every
"тому що це ліс і ми можемо", я настійно рекомендую не робити цього. Ви отримуєте дуже мало, роблячи це:
(setq-every value a b)
vs
(setq a (setq b value))
Але в той же час ви набагато складніше читачам читати код і бути впевненим, що відбувається. setq-every
може бути реалізовано різними способами, і інші користувачі (включаючи майбутнього, який ви) не можете знати, кого обрати автор, просто подивившись на код, який його використовує. [Я спочатку робив тут кілька прикладів, але їх хтось вважав саркастичними і шахрайством.]
Ви можете боротися з цим розумовим накладним покриттям кожного разу, коли дивитесь, setq-every
або можете просто жити з одним додатковим персонажем. (Принаймні у випадку, коли вам потрібно встановити лише дві змінні, але я не можу згадати, що мені коли-небудь доводилося встановлювати більше двох змінних на одне і те ж значення одразу. Якщо ви повинні це зробити, то, мабуть, щось інше не так з кодом.)
З іншого боку, якщо ви дійсно збираєтесь використовувати цей макрос більше, ніж можливо, півдесятка разів, то додаткове опосередкування може бути варте того. Наприклад, я використовую макроси, як --when-let
у dash.el
бібліотеці. Це ускладнює тим, хто вперше стикається з цим у моєму коді, але подолання цієї складності в розумінні того варте, тому що він використовується більше, ніж лише в декілька разів, і, принаймні, на мою думку, робить код більш читабельним .
Можна стверджувати, що те саме стосується setq-every
, але я думаю, що дуже малоймовірно, що саме цей макрос буде використовуватися більше ніж кілька разів. Хорошим правилом є те, що коли визначення макросу (включаючи doc-рядок) додає більше коду, ніж використання макросу видаляє, тоді макрос дуже ймовірно є надмірним (хоча зворотне не обов'язково відповідає дійсності).