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
, но я думаю, что очень маловероятно, что этот конкретный макрос будет использоваться более чем несколько раз. Хорошее эмпирическое правило заключается в том, что когда определение макроса (включая строку документа) добавляет больше кода, чем удаляет использование макроса, тогда макрос, скорее всего, является избыточным (хотя обратное не всегда верно).