¿Cómo puedo desvincular todas las definiciones de símbolos con cierto prefijo?

11

Estoy cambiando la API de mi paquete con bastante frecuencia, pero company-modesaca cada símbolo definido (como debería) en sus terminaciones. No quiero usar accidentalmente un nombre independiente, entonces, ¿cómo puedo desvincular todas las variables y funciones que comienzan con, digamos my-package-,? Después de esto, simplemente podré load-filevolver a hacerlo .

Sean Allred
fuente

Respuestas:

10

Llame unload-featurepara no definir todos los símbolos que se definieron como parte de la carga de una fuente Elisp o un archivo compilado por bytes. Asegúrese de que su archivo finalice llamando provideal final. Esto supone que cargó el archivo con una de las loadfunciones o require, a través de él, no definirá símbolos indefinidos definidos por C-M-x( eval-defun) o mecanismos similares.

Si realmente desea desvincular símbolos en función de su nombre en lugar de basarse en el paquete que los definió, puede usar mapatomspara iterar sobre todos los símbolos.

(mapatoms (lambda (symbol)
            (if (string-prefix-p "foo-" (symbol-name symbol))
                (unintern symbol))))
Gilles 'SO- deja de ser malvado'
fuente
Útil, pero no creo que esto sea efectivo con el desarrollo interactivo como lo describo. Soy un nivel más profundo que el featuresistema; Estoy trabajando solo con funciones y variables sin ninguna agrupación explícita. No me he molestado en evaluar (provide 'my-package).
Sean Allred
2
@SeanAllred No puedo pensar en una buena razón para no usar provide. Pero de todos modos, si realmente quieres hacer las cosas de la manera sucia, mira mi edición.
Gilles 'SO- deja de ser malvado'
Oh, me encanta provide, simplemente no creo que funcione en este caso. ¿Las funciones recuerdan en qué archivo se definieron si se evaluaron de forma interactiva?
Sean Allred
2
unload-featureno tiene ningún efecto si evalúa el código sin cargarlo desde un archivo (que tiene provide).
Dibujó el
2
@SeanAllred No, las funciones solo recuerdan desde dónde se cargaron si se cargaron como parte de la carga de un archivo completo.
Gilles 'SO- deja de ser malvado'
7
  • Use makunboundpara eliminar el uso de un símbolo como una variable dinámica (es decir, para anular su symbol-value).

  • Se usa fmakunboundpara eliminar el uso de un símbolo como función (es decir, para anularlo symbol-function).

  • Use mapatomspara iterar sobre todos los símbolos. Actúe sobre cada uno que symbol-namecoincida con el prefijo particular que le interesa: llame a ambos makunboundy fmakunboundsobre él.

  • No necesita uninternel símbolo, a menos que también esté usando la terminación contra los símbolos mismos, y no solo sobre su uso como variables o funciones. Pero si usted no desea eliminar por completo un símbolo luego usar unintern.

Dibujó
fuente