P: ¿Por qué elisp no tiene espacios de nombres y cómo podríamos obtenerlos?
Elisp no tiene espacios de nombres que no sean el global, lo que ha llevado a la convención de codificación de prefijar todas las funciones, variables y constantes globales con un prefijo único.
Además del factor de molestia, también me parece un problema lento dado 1) el número cada vez mayor de grandes bibliotecas y paquetes, y 2) la existencia continua de funciones y variables heredadas que no respetan la convención de prefijo, o son lo suficientemente idiosincrásicos como para que no haya una buena opción de prefijo que puedan usar También significa que los intentos periódicos de racionalizar el código anterior (como con la transición de cl
a cl-lib
) es una cantidad de trabajo no trivial. (Aunque me alegro por la limpieza, todavía derramo una lágrima cada vez que escribo algo así cl-find
).
Fui hurgando para ver si podía descubrir por qué elisp todavía no tiene espacios de nombres después de algunas décadas de uso, pero me sorprendió un poco la modesta cosecha. La página wiki en espacios de nombres es bastante corta. Nic Ferrier tiene un tratamiento un poco más largo del problema, y también hay un hilo bastante reciente sobre emacs-devel . Hay un viejo subproceso de desbordamiento de pila de 2010 que analiza la posibilidad de usar macros para implementar espacios de nombres; otro ejemplo del enfoque macro se puede encontrar aquí . Hay al menos un par de implementaciones ( aquí y aquí , con una descripción de la última aquí), pero no han visto mucha actividad en un par de años, y no he encontrado ninguna biblioteca que las use.
Supongo que si agregar espacios de nombres fuera fácil, ya estaría hecho. Asi que:
- ¿Cuáles son las barreras técnicas para agregar espacios de nombres a elisp?
- ¿Agregar espacios de nombres rompería mucho código existente?
- ¿Es esta funcionalidad algo que debe ser orgánico para elisp (cambios en el propio intérprete), o podría realmente construirse en la parte superior a través de macros?
Respuestas:
¿Por qué no hay espacios de nombres?
Porque es complicado, y nadie lo ha considerado lo suficientemente urgente como para dar el paso aún. Esto se ha discutido en la lista de desarrolladores antes (más de una vez), y ha habido promesas de arreglar esto después de pasar a git.
Mientras tanto, escribí una solución propia (vea a continuación una lista de opciones).
¿Cuáles son las barreras técnicas?
Justo afuera de la puerta, tienes 3 grandes obstáculos, que debes superar para que los espacios de nombres incluso tengan la oportunidad de trabajar en un Emacs actual:
package.el
necesita comprender los espacios de nombres.Parchear estas 3 cosas para trabajar, sin embargo, usted viene a implementar espacios de nombres no es trivial. Si está dedicado solo a la versión más reciente de Emacs, ciertamente es factible. Si está buscando escribir algún tipo de paquete que también sea compatible con versiones anteriores (como toda la familia 24), se convierte en un gran desafío.
Más allá de eso, hay toneladas de otros obstáculos opcionales. Elisp es excelente debido a todo el poder de las herramientas disponibles para usted y TODAS estas deberían ser parcheadas para trabajar con espacios de nombres. Entre los más importantes están:
¿Rompería mucho código existente?
No si lo haces bien.
¿Es esto algo que debe ser orgánico, o podría realmente construirse en la parte superior a través de macros?
Idealmente, sería orgánico, eso es lo que generalmente se discute cuando aparece en la lista de desarrolladores. Pero puede hacerse lo suficientemente bueno mientras se construye en la parte superior.
Aquí hay algunos ejemplos de esto, tomados de esta lista :
fuente
names
solución. Me pregunto si hay alguna razón para sospechar que una orgánica, integrada en la solución viene en un futuro no muy lejano, o si deberíamos adoptar el incorporado en la solución que usted ha proporcionado.nameless
a esta lista :) Es una idea brillante y resuelve el problema de manera muy clara.La última vez que se discutió esto en emacs-devel, la discusión se detuvo cuando personas como Lars señalaron que les gusta poder hacer
M-x grep
algo. Agregar espacios de nombres a Elisp no debería ser demasiado difícil, pero obtener todas las herramientas familiares para manejarlos correctamente es otro problema.fuente