2012-03-30 17 views
15

Voglio consentire all'utente di scegliere il proprio comando nella "personalizzare" emacs backend (e generalmente essere in grado di memorizzare un nome di forma eseguibile in una variabile), ma questo non funziona:In elisp, come si inserisce una funzione in una variabile?

(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") 

ho provato varie forme, ma ancora senza fortuna, e sto avendo difficoltà a cercarlo, ottengo kilopages di risultati su funzioni e variabili, ma nessuno su come mettere il primo nel secondo ..?

risposta

24

noti che in Emacs Lisp, simboli hanno una cella valore e una cellula funzione, che sono distinti. Quando si valuta un simbolo, si ottiene il valore . Quando valuti un elenco che inizia con quel simbolo, chiami la sua funzione . Questo è il motivo per cui puoi avere una variabile e una funzione con lo stesso nome.

maggior parte dei tipi di assegnazione fissa il valore (ad esempio let, setq, defvar, defcustom, ecc ...) - e come ryuslash mostra è possibile assegnare una funzione come un valore e chiamare tramite funcall - ma ci sono anche modi per assegnare alla cella la funzione di un simbolo utilizzando direttamente fset (o flet, defalias, ecc)

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

Nel tuo caso avrei usato la risposta di ryuslash (tranne che è necessario utilizzare defcustom piuttosto che defvar se lo vuoi essere disponibile tramite customize).

Inoltre, per quanto riguarda "Ho difficoltà a cercare su Google"; Ricorda sempre che Emacs è auto-documentante, e tra le altre cose contiene un buon manuale completo di indice (beh, più di un manuale, infatti). Quindi, anche se Google rimane il tuo primo punto di riferimento, non dovrebbe essere anche l'ultimo se non riesci a trovare quello che stai cercando. Dalla pagina dei contenuti del manuale elisp è possibile passare a "Funzioni" e quindi "Funzioni di chiamata" e verrà comunicato quasi immediatamente a funcall.

+1

Sei a un tiro. Grandi risposte –

+0

Il mio esempio è stato gravemente scelto, mi spiace: voglio usare personalizzare, per esempio permettere all'utente di scegliere il proprio programma di posta, in questo modo:. '(defcustom mio-mail-programma "gnu" comando "client di posta Esempio : " : tipo 'stringa : gruppo' mail-bugger ' Non riesco ad eseguire (programma di posta elettronica) ..? – yPhil

+1

Quindi dovresti usare ': type 'function' piuttosto che'' string', con un valore predefinito di ''gnus' piuttosto che' "gnus" ', e quindi useresti' (funcall my-mail-program) ' . Assicurati di comprendere la differenza tra una stringa e un simbolo. – phils

15

Per eseguire una funzione memorizzata in una variabile è possibile utilizzare funcall

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

(defvar my-function 'dumb-f) 

(funcall my-function) 
==> "I'm a function" 
Problemi correlati