2012-04-03 5 views
11

Estoy tratando de verificar si server-running-p está disponible en mi archivo .emacs antes de llamarlo. Ya tengo el siguiente:¿Cómo comprobar si una función (por ejemplo, server-running-p) está disponible en Emacs?

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

Pero en algunos equipos donde uso de Emacs, llamando (server-running-p) da un error porque la citada llamada no está disponible. Así que quiero verificar si server-running-p está disponible antes de llamarlo. Pensé que boundp haría la prueba, pero llamar a (boundp 'server-running-p) devuelve nil aunque la llamada (server-running-p) se realiza correctamente. ¿Cuál es la forma correcta de verificar que la llamada al server-running-p no fallará ... o al menos para suprimir el error si dicha llamada falla? (¿Y qué tipo de objeto extraño es que de todos modos server-running-pboundp vuelve nil, pero llamar tiene éxito?)

Esto está en Emacs 23.2.1, si hace alguna diferencia.


Realmente encontró la respuesta. Tiene que usar fboundp para esto en lugar de boundp, por alguna razón.

+3

La razón es que puede tener una función y una variable con el mismo nombre (por ejemplo, 'font-lock-mode'). Por lo tanto, necesita diferentes funciones para preguntar "¿Es esto una variable?" y "¿Es esto una función?" – cjm

+0

Gracias. Me había olvidado por completo de la particularidad de algunos lenguajes Lisp. Tiene más sentido ahora. –

Respuesta

21

boundp comprueba si una variable está vinculada. Como server-running-p es una función , querrá usar fboundp. Como lo siguiente:

(if (and (fboundp 'server-running-p) 
     (not (server-running-p))) 
    (server-start)) 
12

Una manera más simple es usar "requerir" para asegurarse de que el código del servidor esté cargado. Esto es lo que yo uso: sugerencia

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

También estoy tratando de mantener mi .emacs compatible tanto con Emacs como con XEmacs. En ese caso, usar 'fbounpd' me parece más seguro, ¿no? –

+0

@ChristianHudon, esto no se trata solo de compatibilidad. Esta versión y la otra hacen dos cosas diferentes. Éste carga el paquete 'server' si no estaba cargado. La otra versión solo inicia el servidor si el paquete 'server' ya estaba cargado en otro lugar. Así que creo que esta versión es más autónoma. No sé sobre XEmacs, pero una alternativa más compatible podría ser usar '(cargar" servidor ")' en su lugar (en lugar de '(requerir 'servidor)', eso es). – harpo

3

de ryuslash fue muy útil, pero he modificado para mis .emacs:

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

ahora se pone en marcha el servidor incluso si no ha sido server.el loaded- server-running-p solo se define cuando se carga server.el y el server-start se carga automáticamente.

Cuestiones relacionadas