2012-10-29 8 views
11

Qualcuno può spiegare quali sono i problemi specifici con l'utilizzo del pacchetto cl in elisp? Come nuovo programmatore di emacs, mi sembra di commettere un errore ogni volta che raggiungo l'opzione (richiesta 'cl). Ho letto e capito il problema della compilazione di byte con il pacchetto cl. Ho esaminato i vecchi argomenti e non ho alcun desiderio di rianimarli. Inoltre, non sto cercando alcun commento generalista sul fatto che common-lisp sia migliore di x brand lisp.Come utilizzare al meglio il Common-Lisp in elisp (se non lo è)?

Quello che mi piacerebbe sapere è praticamente come usare common-lisp in modo che ogni elisp che scrivo abbia una buona possibilità di essere accettato dalla maggior parte dei programmatori elisp. Nello specifico, dovrei evitare di usare interamente il Common Lisp, o ci sono alcune parti del linguaggio che sono accettabili per tutti e alcune parti in cui una buona maggioranza di programmatori potrebbe ridacchiare e deridere?

Senza voler limitare l'ampiezza della risposta, è questo:

(mapcar (lambda(x) (* x x)) '(1 2 3)) 

molto più accettabile di questo:

(require 'cl) 
(loop for el in '(1 2 3) collect (* el el)) 
+1

Sarebbe bello avere qualche commento da parte di chiunque non ami il common-lisp (o forse non ce n'è e il mito è sballato). –

+3

il pacchetto CL non è Common-Lisp, quindi puoi gradirlo e non amarlo. Mi piacciono molte parti di ciò che offre il pacchetto CL, ma ci sono altre parti che sono problematiche per vari motivi. La nuova libreria 'cl-lib' in Emacs-24.3 pulisce lo spazio dei nomi in modo che non ci sia bisogno di preoccuparsi se' cl-lib' è buono o no. La parte di CL che non mi piace ha a che fare con le funzionalità di Common-Lisp che non sono adatte all'implementazione di un "interprete semplice", quindi possono comportare costi di prestazioni imprevisti. (più alcune funzionalità la cui implementazione è difettosa) – Stefan

risposta

8

Durante l'utilizzo di un sacco di librerie di terze parti e la scrittura di alcuni dei il mio codice eLisp, non ho mai incontrato la situazione quando utilizzo il pacchetto CL ha provocato un conflitto di nomi. Quindi, sarei tentato di dire che l'argomento contro l'uso di CL non è altro che puritanesimo (nel senso originale della parola, non intendendo il lato religioso delle cose).

Ma, se stai pianificando un supporto molto lungo e vuoi avere una sorta di backup, ecco cosa farei (ma non lo sto facendo io stesso, perché sistemare le cose una volta interrotte sembra essere una tattica migliore). Per le funzioni nel pacchetto CL che si sta utilizzando, creare un file speciale, in cui è possibile impostare defalias con un prefisso cl-. Ad esempio, invece di avere uno (position ...), avresti (cl-position ...). Teoricamente risparmierai il problema della compatibilità diretta. Tuttavia, le funzioni non vengono rimosse all'istante, riceverai un avviso prima del momento in cui vengono deprecate e avrà molto tempo per l'aggiornamento. Fino a te, davvero.

La macro di loop in Common Lisp è una polemica da sola, non è un tipico costrutto per la lingua ed è per questo che, ad esempio, esiste la libreria iterata. Richiede anche che tu impari "il mini-linguaggio di loop" per usarlo bene, che è una specie di un piccolo linguaggio specifico del dominio, e non c'è davvero alcun requisito che questo tipo di costrutto ne usi uno. MA, il ciclo ha i suoi lati forti. Le funzioni di elaborazione elenco come mapcar o reduce ti saranno utili in casi più banali, come quello che hai nell'esempio, ma nei casi meno banali loop sarà un modo migliore e anche meno verboso di fare la stessa cosa.

4

Hai letto le macro section del manuale? L'utilizzo di macro come l'esempio loop è perfettamente a posto.

Ma si dovrebbe usare eval-when-compile intorno al bisogno.

Infatti, (eval-when-compile (require 'cl)) appare 66 volte solo nella cartella root lisp nel mio Emacs.

+0

Sì, ho letto la sezione macro e ho esaminato alcuni codici macro nei pacchetti. Sto ancora aspettando quel momento 'aha' quando trovo un problema che _needs_ una soluzione macro. –

+0

Nessun problema _needs_ una soluzione macro. Alcuni possono essere semplificati con macro. Questo è un esempio di clojure piuttosto che elisp, ma ho scritto una macro per estrarre tutti i campi statici di una classe java nell'esporlo all'interno del mio spazio dei nomi. La 'soluzione' senza macro sarebbe quella di scrivere i binding uno per uno ... – Cubic

4

A meno che non si preveda di integrare il codice in Emacs, utilizzare il pacchetto CL e inserire questo snippet nel proprio .emacs per disabilitare gli avvisi.

(byte-compile-disable-warning 'cl-functions) 

Nota: è possibile trovare alcuni consigli sulla programmazione elisp su nicferrier's blog.