¿Cuándo usar las propiedades del símbolo?

7

Digamos que necesito asociar símbolos con directorios, y esto solo tendrá que hacerse para una pequeña cantidad de boundpsímbolos.

A mi modo de ver, hay dos maneras fáciles de hacerlo:

  1. Almacene esta asociación en una variable separada (lista o un mapa hash). De esta manera, el directorio de cada símbolo sería accesible con (cdr (assq SYMBOL my-alist)).
  2. Almacene esto en una propiedad de símbolo. De esta manera, sería accesible con (get SYMBOL 'my-directory).

¿Cuál de estas sería la forma idiomática de hacer un seguimiento de esta información?

Malabarba
fuente
Valdría la pena indicar si sabe con certeza que no existe un caso de uso para cualquiera que desee vincular dinámicamente los valores en un ámbito temporal (ya que eso descartaría la opción 2).
phils
@phils buen punto. Por diseño, no está destinado a vincularse, pero creo que es una preocupación válida. Nunca se sabe qué casos de uso pueden encontrar otras personas para sus funciones.
Malabarba
@phils: ¿Qué quieres decir? Aquí solo se cuestionan los accesorios del símbolo, no los valores del símbolo, ¿no? (defvar s 5) (put 's 'd "c:/abc/") (let ((s 4)) (message "d: %s, val: %S" (get 's 'd) s)). Y OP: ¿por qué hablas de "funciones", no de símbolos? Debo estar perdiendo algo.
Dibujó el
@Drew se refería a dejar enlazar el directorio asociado con un símbolo. No es posible si usa las propiedades de símbolo, pero es posible si almacena esta información en una variable como una lista (solo permite vincular la lista). En cuanto a su segunda pregunta, dije "funciones" porque todo este comportamiento estará envuelto por funciones, por supuesto. No creo haber visto un paquete sin funciones. :-)
Malabarba
Si ustedes dos se entienden, entonces no hay necesidad de explicarlo, pero FWIW todavía no lo entiendo. Por "vincular un directorio" supongo que se refiere a vincular una variable a una cadena de directorio. Es ciertamente posible que el valor de una propiedad de símbolo sea un símbolo, cuyo valor de símbolo contiene la cadena dir. let-vincular ese símbolo de cadena de directorios (que se usa como valor de apoyo) no debería ser un problema. (Siéntase libre de ignorar si no es pertinente.)
Dibujó el

Respuestas:

7

Realmente depende de los casos de uso.

En términos generales, las propiedades de los símbolos son características de "bajo nivel" / "internas" y no se deben usar para cosas de "nivel de usuario". Sin embargo, hay un lugar para todo :-)

Algunos puntos que puede considerar son:

  1. Velocidad: las propiedades de los símbolos son las más rápidas, seguidas de cerca por las tablas hash; Las listas son lentas .
  2. Es más fácil restablecer su sistema (es decir, eliminar todos los vestigios de su paquete) con la tabla alist / hash (restablecer la variable a nil) que con las propiedades del símbolo (iterar sobre obarrayy eliminar todas las propiedades relevantes de todos los símbolos).
  3. Es fácil sombrear dinámicamente la configuración usando alist; mucho más difícil con tablas hash y propiedades de símbolos.

Otra opción que es posible que desee considerar es .dir-locals.el.

sds
fuente
Buena respuesta. No sé sobre el # 2, sin embargo. ¿Qué quieres decir con "reiniciar tu sistema"? ¿Estás hablando de la dificultad relativa de eliminar una propiedad de un símbolo (vs, por ejemplo, una clave de una lista)?
Dibujó el
@Drew: Aclaré mi punto. ¿Es mejor ahora?
sds
Sí, completamente claro ahora. Me preguntaba si tal vez no quisiste decir eso.
Dibujó el
0

Siempre que use el nombre canónico para el directorio, una tabla hash o una lista son funcionales. Si espera que el usuario modifique o inspeccione los datos, use una lista. De lo contrario, una tabla hash funciona mejor y escalará mucho mejor.

Ted Zlatanov
fuente