Zastanawiam się, czy istnieje standardowa praktyka dotycząca używania etykiet w Lisp. Wprowadziłem w życie implementację algorytmu Lisp opisaną w pierwszej odpowiedzi tutaj. Generating permutations lazily Moja aktualna wersja używa etykiet do rozbicia części funkcji.Lisp Style funkcje lokalne etykiety pytanie czy nie?
(defun next-permutation (pmute)
(declare (vector pmute))
(let ((len (length pmute)))
(if (> len 2)
(labels ((get-pivot()
(do ((pivot (1- len) (1- pivot)))
((or (= pivot 0)
(< (aref pmute (1- pivot))
(aref pmute pivot)))
pivot)))
(get-swap (pivot)
(let ((swp (1- len)))
(loop for i from (1- len) downto pivot do
(if (or (and (> (aref pmute i)
(aref pmute (1- pivot)))
(< (aref pmute i) (aref pmute swp)))
(< (aref pmute swp) (aref pmute (1- pivot))))
(setf swp i)))
swp))
(next (swp pivot)
(rotatef (aref pmute (1- pivot)) (aref pmute swp))
(reverse-vector pmute pivot (1- len))))
(let ((piv (get-pivot)))
(if (> piv 0)
(next (get-swap piv) piv)
nil))))))
Ponieważ każda etykieta jest wywoływana tylko raz zastanawiałem się, czy to jest uważane za złą praktyką, ponieważ jedyny powód, aby zrobić to w tym przypadku ze względów estetycznych. Twierdzę, że obecna wersja z etykietami jest bardziej przejrzysta, ale może to być sprzeczne z powszechną mądrością, której nie jestem świadomy, będącą nowością w Lisp.
Możesz użyć 'flet' zamiast' labels', jeśli twoje funkcje nie muszą się nawzajem odwoływać (lub siebie). – Svante
Czy jest jakaś korzyść z tego powodu, oprócz przekazywania tych dodatkowych informacji innym osobom czytającym kod? – asm
Prawdopodobnie nie. Pamiętaj jednak, że powinieneś napisać kod dla kolejnej osoby czytającej kod, a kompilator/tłumacz nie jest Twoją podstawową publicznością. – Vatine