2012-03-30 15 views
15

Ich möchte dem Benutzer ermöglichen, ihre eigenen Befehl im „Anpassen“ Emacs-Backend zu wählen (und allgemein in der Lage sein, eine ausführbare Form Namen in einer Variablen speichern), aber das funktioniert nicht:In elisp, wie setze ich eine Funktion in eine 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") 

Ich habe versucht, verschiedene Formen, aber immer noch kein Glück, und ich habe es schwer, danach zu suchen, ich bekomme kilopages von Ergebnissen über Funktionen und Variablen, aber keine darüber, wie man die erstere in letzteres setzt ..?

Antwort

24

verwenden können Hinweis, dass in Emacs Lisp, Symbole Wert Zelle und eine Funktionszelle haben, die verschieden sind. Wenn Sie ein Symbol auswerten, erhalten Sie den Wert . Wenn Sie eine Liste mit diesem Symbol auswerten, rufen Sie ihre Funktion. Deshalb können Sie eine Variable und eine Funktion mit demselben Namen haben.

Die meisten Arten der Zuweisung wird der Wert (zB let, setq, defvar, defcustom, etc ...) - und als ryuslash zeigt können Sie eine Funktion als Wert zuweisen und über funcall nennen - aber es sind auch (außer Sie direkt fset (oder flet, defalias, usw.) unter Verwendung zuweisen

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

In Ihrem Fall Möglichkeiten, um ein Symbol der Funktionszelle I Antwort ryuslash Bedürfnis verwenden würde defcustom anstatt defvar zu verwenden, wenn Sie es wollen verfügbar sein über customize).

Auch in Bezug auf "Ich habe eine harte Zeit googeln dafür"; immer daran denken, dass Emacs ist selbst-Dokumentieren, und unter anderem enthält eine gute Anleitung komplett mit Index (na ja, mehr als ein Handbuch, in der Tat). Auch wenn Google Ihr erster Anlaufpunkt bleibt, sollte es nicht Ihr letzter sein, wenn Sie nicht finden, wonach Sie suchen. Von der Inhaltsseite des elisp-Handbuchs aus können Sie zu "Funktionen" und dann "Funktionen aufrufen" navigieren und Sie werden fast sofort über funcall informiert.

+1

Sie sind in einer Rolle. Große Antworten. –

+0

Mein Beispiel war schlecht gewählt, sorry: Ich möchte anpassen verwenden, um, sagen wir lassen den Benutzer seine E-Mail-Programm wählen, etwa so:. '(defcustom my-Mail-Programm "Gnus" „Mail-Client Befehl Beispiel : wl " : type 'string : gruppe' mail-bugger)' kann ich nicht ausführen (my-mail-programm) ..? – yPhil

+1

Sie sollten also ': type 'function' anstatt '' string' verwenden, mit einem Standardwert von '' gnus' anstatt' 'gnus'', und dann würden Sie' (funcall my-mail-program) 'verwenden . Stellen Sie sicher, dass Sie den Unterschied zwischen einer Zeichenfolge und einem Symbol verstehen. – phils

15

Um eine Funktion in einer Variablen gespeichert laufen Sie funcall

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

(defvar my-function 'dumb-f) 

(funcall my-function) 
==> "I'm a function" 
Verwandte Themen