Me preguntaba si existe una práctica estándar con respecto al uso de etiquetas en Lisp. He estado jugando con una implementación de Lisp del algoritmo descrito en la primera respuesta aquí Generating permutations lazily Mi versión actual usa etiquetas para separar partes de la funcionalidad.Lisp Style question label funciones locales o no?
(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))))))
Como cada etiqueta sólo se llama una vez me preguntaba si esto se considera una mala práctica ya que la única razón para hacerlo en este caso es por razones estéticas. Yo diría que la versión actual con etiquetas es más clara, pero eso puede ir en contra de la sabiduría común de la que no tengo conocimiento, siendo nuevo para Lisp.
Puede usar 'flet' en lugar de' labels' si sus funciones no necesitan referirse entre ellas (ni a ellas mismas). – Svante
¿Hay alguna ventaja de hacer esto además de comunicar ese poco de información extra a cualquier persona que lea el código? – asm
Probablemente no. Sin embargo, recuerde que debe escribir el código para la siguiente persona que lea el código, el compilador/intérprete no es su audiencia principal. – Vatine