Perché elisp non ha spazi dei nomi?


40

D: Perché elisp non ha spazi dei nomi e come possiamo ottenerli?

Elisp non ha spazi dei nomi diversi da quello globale, il che ha portato alla convenzione di codifica del prefisso di tutte le funzioni, variabili e costanti globali con un prefisso univoco.

A parte il fattore di fastidio, mi sembra anche un problema lento dato 1) il numero in continua espansione di grandi librerie e pacchetti e 2) la continua esistenza di funzioni e variabili legacy che non rispettano la convenzione del prefisso, oppure sono sufficientemente idiosincratici da non poter utilizzare una buona opzione di prefisso. Significa anche che i tentativi periodici di razionalizzare il codice più vecchio (come con la transizione da cla cl-lib) è una quantità non banale di lavoro. (Anche se sono contento per la pulizia, verso ancora una lacrima ogni volta che scrivo qualcosa del genere cl-find).

Sono andato in giro per vedere se potevo scoprire perché Elisp non ha ancora spazi dei nomi dopo alcuni decenni di utilizzo, ma sono rimasto un po 'sorpreso dal raccolto modesto. La pagina wiki sugli spazi dei nomi è piuttosto breve. Nic Ferrier ha un trattamento leggermente più lungo del problema e c'è anche un thread abbastanza recente su emacs-devel su di esso. C'è un vecchio thread Stack Overflow del 2010 che discute la possibilità di usare macro per implementare spazi dei nomi; un altro esempio di approccio macro può essere trovato qui . Ci sono almeno un paio di implementazioni ( qui e qui , con una descrizione di quest'ultima qui) là fuori, ma non vedono molta attività da un paio d'anni e non ho incontrato nessuna biblioteca che li utilizza.

Presumo che, se l'aggiunta di spazi dei nomi fosse facile, sarebbe già stato fatto. Così:

  • Quali sono gli ostacoli tecnici all'aggiunta di spazi dei nomi a elisp?
  • L'aggiunta di spazi dei nomi spezzerebbe molto il codice esistente?
  • Questa funzionalità è qualcosa che deve essere organico da elisp (modifiche all'interprete stesso) o potrebbe davvero essere costruita in cima tramite macro?

6
Puoi dare un'occhiata a questo: github.com/Bruce-Connor/names Sembra essere un'implementazione compatibile con le versioni precedenti (con l'attuale modo manuale di separare i nomi) degli spazi dei nomi automatici. (E sono sicuro al 99% di aver visto un'altra libreria del genere, che consente allo sviluppatore di esportare un sottoinsieme di funzioni con spazi dei nomi, menzionato di recente su alcuni blog di emacs, ma non sono riuscito a ritrovarlo).
T. Verron,

2
Secondo, dovresti dare un'occhiata al link sopra. È una macro molto recente (rilasciata il mese scorso) e molto robusta. Sto ancora lavorando su alcuni nodi in termini di compatibilità con strumenti come edebug, ma il pacchetto funziona. Rispondere alla tua domanda è un saggio davvero lungo (le barriere tecniche che ho incontrato erano molte) ma proverò a inserirlo nei post del blog nelle prossime settimane.
Malabarba,

1
Immagino che gli spazi dei nomi significino cose diverse. Avrei detto che emacs ha diversi spazi dei nomi: uno per le variabili, un altro per funzioni e macro, un altro per i volti e per i temi e ...
Harald Hanche-Olsen,

1
@ HaraldHanche-Olsen puoi sicuramente dirlo. In quel contesto si sta chiedendo perché non ci siano spazi dei nomi per pacchetto.
Malabarba,

Risposte:


28

Perché nessun spazio dei nomi?

Perché è complicato e nessuno lo ha considerato abbastanza urgente da fare ancora il grande passo. Questo è stato discusso in precedenza nell'elenco degli sviluppatori (più volte di uno), e ci sono state promesse di risolverlo dopo il passaggio a git.

Nel frattempo, ho scritto una mia soluzione (vedi sotto per un elenco di opzioni).

Quali sono le barriere tecniche?

Appena fuori dalla porta hai 3 grandi ostacoli, che devi superare in modo che gli spazi dei nomi abbiano persino la possibilità di lavorare su un attuale Emacs:

  • Devi cambiare il modo in cui i simboli sono internati (questa è la parte facile).
  • Il compilatore di byte deve comprendere gli spazi dei nomi.
  • La generazione del caricamento automatico utilizzata da package.eldeve comprendere gli spazi dei nomi.

Patching di queste 3 cose con cui lavorare, tuttavia si arriva ad implementare spazi dei nomi non è banale. Se ti dedichi solo alla versione più recente di Emacs, è sicuramente fattibile. Se stai cercando di scrivere una sorta di pacchetto che supporti anche le versioni precedenti (come l'intera famiglia 24), si trasforma in un inferno di una sfida.

Oltre a ciò, ci sono tonnellate di altri ostacoli opzionali. Elisp è eccezionale a causa di tutta la potenza degli strumenti a tua disposizione e TUTTI questi dovrebbero essere patchati per funzionare con gli spazi dei nomi. Tra i più importanti ci sono:

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

Romperebbe molto codice esistente?

Non se lo fai bene.

È qualcosa che deve essere organico o potrebbe davvero essere costruito sopra tramite macro?

Idealmente sarebbe organico, questo è ciò che di solito viene discusso quando compare nell'elenco degli sviluppatori. Ma può essere reso abbastanza buono pur essendo costruito in cima.
Ecco alcuni esempi di questo, presi da questo elenco :


1
Grazie - è stata una presa molto istruttiva sul problema. Sono curioso del tuo ultimo punto riguardo: la tua namessoluzione. Mi chiedo se non c'è alcun motivo di sospettare che un organico, integrato in soluzione è in arrivo in un futuro non troppo lontano, o se dovremmo adottare l'incorporato sulla soluzione che ci hai fornito.
Dan

1
@Dan Sì, c'è. . Detto questo, non c'è motivo di non adottare Nomi nel frattempo. È pienamente compatibile con le convenzioni di Emacs, quindi qualsiasi pacchetto che utilizza Names è libero di smettere di usare Names in qualsiasi momento e l'utente non ne saprà nulla.
Malabarba,

Dovresti davvero aggiungere namelessa questo elenco :) È un'idea geniale e risolve il problema in modo molto chiaro.
Clément,

22

L'ultima volta che questo è stato discusso su emacs-devel, la discussione si è interrotta quando persone come Lars hanno sottolineato che a loro piace poter fare M-x grepqualcosa. L'aggiunta di spazi dei nomi a Elisp non dovrebbe essere troppo difficile, ma ottenere tutti gli strumenti familiari per gestirli correttamente è un altro problema.


Penso che potrebbe essere facilmente 'riparato' creando alias per le funzioni comuni più utilizzate (o tutte, forse)
Jesse,

1
La necessità di "grep" si presenta di solito mentre si sviluppa un pacchetto, dove è necessario sapere dove una variabile / funzione potrebbe essere usata in altri pacchetti, quindi può applicarsi a qualsiasi variabile / funzione arbitraria, piuttosto che solo per quelle importanti importanti. Per questo motivo, l'aggiunta di alcuni alias non farà alcuna differenza. Un altro motivo per cui mit non aiuterà, è che l'aggiunta di un alias non ti aiuterà a trovare gli usi che non usano questo alias.
Stefan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.