2012-03-30 15 views
15

Quiero permitir al usuario elegir su propio comando en el "personalizar" backend emacs (y por lo general será capaz de almacenar un nombre de formato ejecutable en una variable), pero esto no funciona:En elisp, ¿cómo pongo una función en una variable?

(defun dumb-f() 
    (message "I'm a function")) 

    (defvar my-function "dumb-f") 

    (my-function) 
    ==> Debugger entered--Lisp error: (invalid-function "dumb-f") 

    (setq my-function 'dumb-f) 

    (my-function) 
    ==> Debugger entered--Lisp error: (invalid-function "dumb-f") 

Probé Varias formas, pero todavía sin suerte, y estoy teniendo dificultades para buscarlo, obtengo kilopagos de resultados sobre funciones y variables, pero ninguno sobre cómo poner el primero en este último ...

Respuesta

24

Tenga en cuenta que en Emacs Lisp, los símbolos tienen una celda de valor y una celda de función, que son distintos. Cuando evalúa un símbolo, obtiene su valor . Cuando evalúa una lista que comienza con ese símbolo, llama a su función . Es por eso que puede tener una variable y una función con el mismo nombre.

La mayoría de los tipos de asignación fijará el valor (por ejemplo let, setq, defvar, defcustom, etc ...) - y como muestra ryuslash puede asignar una función como un valor y lo llaman a través de funcall - pero hay son también formas de asignar a la función celular de un símbolo utilizando directamente fset (o flet, defalias, etc)

(fset 'my-function 'dumb-f) 
(my-function) 

En su caso me gustaría utilizar la respuesta de ryuslash (excepto que se debe utilizar defcustom en lugar de defvar si lo desea para estar disponible a través del customize).

Además, con respecto a "Estoy teniendo dificultades para buscar en Google"; recuerde siempre que Emacs es autodocuándose, y entre otras cosas contiene un buen manual completo con índice (bueno, más de un manual, de hecho). Entonces, incluso si Google sigue siendo su primer puerto de escala, tampoco debería ser el último si no puede encontrar lo que está buscando. Desde la página de contenidos del manual de elisp puede navegar a "Funciones" y luego a "Funciones de llamadas" y se le informará acerca de funcall casi de inmediato.

+1

Estás en racha. Grandes respuestas. –

+0

Mi ejemplo fue gravemente elegida, lo siento: Quiero usar personalizar a, por ejemplo permitir al usuario elegir su programa de correo electrónico, así:. '(defcustom mi-mail-programa "ñu" comando "cliente de correo Ejemplo : wl " : escriba 'cadena : grupo' bug-mail ') No puedo ejecutar (my-mail-program) ..? – yPhil

+1

Así que debería usar la función ': type 'en lugar de'' string', con un valor predeterminado de ''gnus' en lugar de' "gnus" ', y luego usaría' (funcall my-mail-program) ' . Asegúrese de comprender la diferencia entre una cadena y un símbolo. – phils

15

Para ejecutar una función almacenada en una variable puede utilizar funcall

(defun dumb-f() 
    (message "I'm a function")) 

(defvar my-function 'dumb-f) 

(funcall my-function) 
==> "I'm a function" 
Cuestiones relacionadas