Domanda In Emacs, cosa significa questo errore? "Attenzione: pacchetto cl richiesto in fase di esecuzione"


Sto calcolando byte un modulo. Mi dà questo avvertimento:

 Warning: cl package required at runtime

Perché questo è un avvertimento? Sono ben consapevole del fatto che sto usando il cl pacchetto. In effetti c'è un (require 'cl) dichiarazione nel modulo.

C'è qualcosa di sbagliato nell'usare il cl cose?

In tal caso, esiste un elenco di soluzioni alternative pubblicate? Le cose principali che uso sono mapcan e delete-duplicates.


34
2018-02-16 17:17


origine


risposte:


Il motivo di questo avviso è una politica GNU che non vuole che un pacchetto cl sia usato in Elisp. Ma sarebbe anche sciocco proibirlo completamente. Così hanno deciso di mostrare un avvertimento.

Puoi trovare maggiori informazioni Qui


24
2018-02-16 17:44



Nel caso qualcuno lo leggesse nella sua ricerca di un uso corretto di cl: I metodi descritti qui sono ora deprecati.

Almeno come emacs 24, invece di cl dovresti usare cl-lib o, se le macro sono sufficienti, cl-macs. Queste sono le nuove versioni di cl che funzionano con uno spazio dei nomi pulito. Per esempio. invece di defun* hai cl-defun.

La vecchia cl-package ora è solo per retrocompatibilità e non dovrebbe essere usato nel nuovo codice.


21
2018-06-17 09:34



Ci sono scontri nello spazio dei nomi tra Elisp e Common Lisp ma il cl il pacchetto li aggira aggiungendo un asterisco ai nomi ripetuti. Ad esempio implementa la versione Common Lisp di defun ma lo chiama defun *. Il risultato è che non ci sono scontri tra spazi dei nomi cl ed Elisp ed è abbastanza sicuro (richiedere 'cl).

Se vuoi eliminare l'avviso sciocco, personalizza la variabile byte-compilatore-warnings[1] Questo disattiverà l'avviso quando compilerai il codice. Se si distribuisce il codice, l'avviso verrà probabilmente restituito quando qualcuno lo compila. Se non vuoi che ciò accada, usa il codice:

(with-no-warnings
   (require 'cl))

È possibile interrompere l'avviso del compilatore di byte su qualsiasi modulo Lisp in modo simile. [2] Probabilmente non è una buona idea in generale, ma potresti essere in grado di giustificarlo in questo caso.

Il codice:

(eval-when-compile
   (require 'cl))

eliminerà l'avviso, ma se lo farai, potrai utilizzare le macro dal pacchetto solo. Le macro vengono valutate in fase di compilazione e Elisp non ha bisogno di conoscerle in fase di esecuzione. Se usi solo le macro da qualsiasi pacchetto, non solo cl, quindi è una buona idea da usare eval-quando-compile poiché interromperà il caricamento non necessario dei pacchetti in fase di esecuzione, risparmiando sia memoria che rendendo il codice più veloce. Ma mi sembra che sia un uso improprio della funzione usarlo solo per evitare un avvertimento. E, naturalmente, se vuoi utilizzare una qualsiasi delle funzioni di cl, non puoi usare eval-quando-compile Comunque.

[1] Potrebbe essere necessario aggiungere (richiede 'bytecomp) al tuo file .emacs per avere accesso a questa variabile.

[2] In teoria, comunque, ma c'è un bug in con-no-avvertimenti ciò significa che non sopprime alcuni avvisi sulle variabili lessicali.


12
2017-12-12 02:55



Common Lisp ha molti scontri nello spazio dei nomi con elis, spesso le funzioni sembrano fare la stessa cosa, ma differiscono in alcuni dettagli sottili. Mescolare i due è un rischio che è meglio non fare dietro la schiena dell'utente. Per questo motivo, la maggior parte delle funzioni più utili in cl.el sono definite come macro, in modo che cl.el possa essere richiesto solo in fase di compilazione e le macro influenzeranno il codice che le utilizzerà nelle sessioni future di Emacs.


4
2018-02-17 08:15



Non sono stato in grado di sopprimere questo messaggio dopo aver letto i commenti prima dei miei.

Tuttavia, ho ricevuto le seguenti istruzioni da una persona gentile sulla mailing list GNU emacs:

Richiedi cl-lib, quindi cambia la chiamata per usare cl-remove-if-not, invece di rimuovere-se-non.

Quale si è dimostrato essere il rimedio.

In breve: richiedendo cl-lib, si deve anche cambiare il nome della funzione / macro chiamata.

HTH ....


1
2017-11-23 01:56