setq
zwraca wartość, dzięki czemu możesz po prostu:
(setq f-loc1 (setq f-loc2 "/foo/bar"))
Jeśli nie chcesz na tym polegać, użyj:
(setq f-loc1 "/foo/bar" f-loc2 f-loc1)
Osobiście unikałbym tego drugiego i zamiast tego napisałbym:
(setq f-loc1 "/foo/bar"
f-loc2 f-loc1)
lub nawet
(setq f-loc1 "/foo/bar")
(setq f-loc2 f-loc1)
I pierwsze podejście zastosowałbym tylko w dość szczególnych okolicznościach, w których faktycznie podkreśla intencję, lub gdy alternatywą byłoby użycie drugiego podejścia, albo inaczej progn
.
Możesz przestać czytać tutaj, jeśli powyższe sprawia ci przyjemność. Ale myślę, że to dobra okazja, aby ostrzec ciebie i innych przed nadużywaniem makr.
Wreszcie, choć kuszące jest pisanie makra typu setq-every
„ponieważ jest to seplenienie i możemy”, zdecydowanie odradzam to. Zyskujesz bardzo niewiele, robiąc to:
(setq-every value a b)
vs
(setq a (setq b value))
Ale jednocześnie znacznie utrudniasz innym czytelnikom czytanie kodu i upewnienie się, co się stanie. setq-every
może być zaimplementowany na różne sposoby, a inni użytkownicy (w tym przyszli, których jesteś) nie mogą wiedzieć, który autor wybrał, po prostu patrząc na kod, który go używa. [Pierwotnie podałem tutaj kilka przykładów, ale zostały one przez kogoś uznane za sarkastyczne i rant.]
Możesz poradzić sobie z tym mentalnym kosztem za każdym razem, gdy na niego patrzysz, setq-every
lub możesz po prostu żyć z jedną dodatkową postacią. (Przynajmniej w przypadku, gdy musisz ustawić tylko dwie zmienne, ale nie pamiętam, że kiedykolwiek musiałem ustawić więcej niż dwie zmienne na tę samą wartość. Jeśli musisz to zrobić, to prawdopodobnie jest coś innego złego z twoim kodem.)
Z drugiej strony, jeśli naprawdę zamierzasz używać tego makra więcej niż może kilkanaście razy, dodatkowa pośrednia może być tego warta. Na przykład używam makr jak --when-let
z dash.el
biblioteki. Utrudnia to tym, którzy po raz pierwszy napotykają go w moim kodzie, ale warto przezwyciężyć tę trudność ze zrozumieniem, ponieważ jest on używany więcej niż tylko kilka razy, a przynajmniej moim zdaniem sprawia, że kod jest bardziej czytelny .
Można argumentować, że to samo dotyczy setq-every
, ale myślę, że jest bardzo mało prawdopodobne, aby to konkretne makro zostało użyte więcej niż kilka razy. Dobrą zasadą jest to, że gdy definicja makra (w tym ciąg doc) dodaje więcej kodu niż użycie makra usuwa, wówczas makro najprawdopodobniej jest nadmiernie zabójcze (choć sytuacja odwrotna nie musi być prawdziwa).