2012-04-03 12 views
11

Sto cercando di verificare se server-running-p è disponibile nel mio file .emacs prima di chiamarlo. Ho già il seguente:Come verificare se una funzione (ad esempio server-running-p) è disponibile in Emacs?

(if (not (server-running-p)) 
    (server-start)) 

Ma su alcuni computer in cui io uso Emacs, chiamando (server-running-p) dà un errore perché ha detto chiamata non è disponibile. Quindi voglio verificare se server-running-p è disponibile prima di chiamarlo. Ho pensato che il tentativo fosse boundp, ma chiamando (boundp 'server-running-p) restituire nil anche se la chiamata (server-running-p) ha esito positivo. Qual è il modo giusto per verificare che la chiamata server-running-p non fallirà ... o almeno per sopprimere l'errore se detta chiamata fallisce. (E che tipo di oggetto è strano server-running-p comunque che boundp rendimenti nil, ma chiamando riesce?)

Ciò è su Emacs 23.2.1, se fa alcuna differenza.


effettivamente trovato la risposta. È necessario utilizzare fboundp per questo invece di boundp, per qualche motivo.

+3

Il motivo è che è possibile avere una funzione e una variabile con lo stesso nome (ad esempio 'font-lock-mode'). Quindi hai bisogno di diverse funzioni per chiedere "È una variabile?" e "questa è una funzione?" – cjm

+0

Grazie. Mi ero completamente dimenticato di quella particolarità di alcune lingue Lisp. Ha più senso ora. –

risposta

21

boundp verifica se una variabile è associata. Dal server-running-p è una funzione che si desidera utilizzare fboundp. In questo modo:

12

Un modo più semplice è utilizzare "require" per assicurarsi che il codice del server sia caricato. Ecco quello che io uso: suggerimento

(require 'server) 
(unless (server-running-p) 
    (server-start)) 
+2

Sto anche cercando di mantenere i miei .emacs compatibili sia con Emacs che con XEmacs. In tal caso, usare 'fbounpd' mi sembra più sicuro, no? –

+0

@ChristianHudon, non si tratta solo di compatibilità. Questa versione e l'altra fanno due cose diverse. Questo carica il pacchetto 'server' se non era già caricato. L'altra versione avvia il server solo se il pacchetto 'server' è già stato caricato altrove. Quindi penso che questa versione sia più autosufficiente. Non conosco XEmacs, ma un'alternativa più compatibile potrebbe essere quella di usare '(load" server ")' invece (invece di '(richiede 'server'), cioè). – harpo

3

di ryuslash è stato davvero utile, ma ho modificato per i miei .emacs:

(unless (and (fboundp 'server-running-p) 
      (server-running-p)) 
    (server-start)) 

questo diventa il server in esecuzione, anche se non è stato server.el loaded- server-running-p viene definito solo quando viene caricato server.el e server-start viene caricato automaticamente.

Problemi correlati