¿Por qué elisp no tiene espacios de nombres?

40

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 cla 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?
Dan
fuente
66
Puede echar un vistazo a esto: github.com/Bruce-Connor/names Parece ser una implementación de espacios de nombres automáticos compatible con versiones anteriores (con la forma manual actual de separar nombres). (Y estoy 99% seguro de haber visto otra biblioteca de este tipo, lo que permite al desarrollador exportar un subconjunto de funciones con espacios de nombres, mencionados recientemente en algunos blogs de emacs, pero no pude encontrarlos de nuevo).
T. Verron
2
En segundo lugar, deberías echar un vistazo al enlace de arriba. Es una macro de espacio de nombres muy reciente (lanzada el mes pasado) y muy robusta. Todavía estoy resolviendo algunos problemas en términos de compatibilidad con herramientas como edebug, pero el paquete funciona. Responder a su pregunta es un ensayo realmente largo (las barreras técnicas que enfrenté eran muchas), pero intentaré incluirlo en las publicaciones de blog en las próximas semanas.
Malabarba
1
Supongo que los espacios de nombres significan cosas diferentes. Hubiera dicho que emacs tiene varios espacios de nombres: uno para variables, otro para funciones y macros, otro para caras y temas, y ...
Harald Hanche-Olsen
1
@ HaraldHanche-Olsen ciertamente puedes decir eso. En ese contexto, se pregunta por qué no hay espacios de nombres por paquete.
Malabarba

Respuestas:

28

¿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:

  • Debe cambiar la forma en que se internan los símbolos (esta es la parte fácil).
  • El compilador de bytes necesita comprender los espacios de nombres.
  • La generación de carga automática utilizada por package.elnecesita 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:

  • edebug
  • eval-defun
  • eval-last-sexp
  • limo

¿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 :

Malabarba
fuente
1
Gracias, esa fue una versión muy informativa sobre el tema. Tengo curiosidad sobre su último punto re: su namessolució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.
Dan
1
@ Dan Sí, lo hay. . Dicho esto, no hay razón para no adoptar nombres mientras tanto. Es totalmente compatible con las convenciones de Emacs, por lo que cualquier paquete que use Nombres es libre de dejar de usar Nombres en cualquier momento, y el usuario no sabrá nada.
Malabarba
Realmente deberías agregar namelessa esta lista :) Es una idea brillante y resuelve el problema de manera muy clara.
Clément
22

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 grepalgo. 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.

Stefan
fuente
Creo que eso podría 'arreglarse' fácilmente creando alias para las funciones comunes más utilizadas (o todas ellas, tal vez)
Jesse
1
La necesidad de "grep" aparece generalmente durante el desarrollo de un paquete, donde necesita saber dónde se puede usar una variable / función en otros paquetes, para que pueda aplicarse a cualquier variable / función arbitraria, en lugar de solo a las importantes importantes. Por esta razón, agregar algunos alias no hará ninguna diferencia. Otra razón por la cual mit no ayudará, es que agregar un alias no lo ayudará a encontrar los usos que no usan este alias.
Stefan