2012-03-30 28 views
15

Chcę, aby umożliwić użytkownikowi wybrać własne polecenie w „Dostosuj” emacs backend (i ogólnie w stanie przechowywać wykonywalnego nazwę formularza w zmiennej), ale to nie działa:W elisp, jak umieścić funkcję w zmiennej?

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

Próbowałam różne formy, ale wciąż nie ma szczęścia i trudno mi go szukać, dostaję kilogramy wyników o funkcjach i zmiennych, ale nie ma o tym, jak umieścić te pierwsze w drugim ...?

Odpowiedz

24

pamiętać, że w Emacs Lisp, symbole mają komórkę wartości i funkcji komórek, które są różne. Podczas oceny symbolu otrzymujesz jego wartość o wartości. Kiedy oceniasz listę zaczynającą się od tego symbolu, wywołujesz jego funkcję . Dlatego możesz mieć zmienną i funkcję o tej samej nazwie.

większości rodzajów przypisania będzie ustawiona wartość (np let, setq, defvar, defcustom, etc ...) - i jak pokazuje ryuslash można przypisać funkcję jako wartość i nazywają to poprzez funcall - ale tam są również sposoby przypisania do funkcji komórek symbolem bezpośrednio przy użyciu fset (lub flet, defalias itp)

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

W twoim przypadku użyłbym odpowiedź ryuslash (z wyjątkiem trzeba użyć defcustom zamiast defvar jeśli chcesz być dostępne przez customize).

Ponadto, jeśli chodzi o "Mam problem z googlowaniem"; zawsze pamiętaj, że Emacs jest self-documenting, a między innymi zawiera dobrą instrukcję z indeksem (no, właściwie, więcej niż jeden podręcznik, w rzeczywistości). Nawet jeśli Google pozostanie Twoim pierwszym portem połączenia, nie powinno to być także twoje ostatnie, jeśli nie możesz znaleźć tego, czego szukasz. Ze strony podręcznika podręcznika zawartości możesz przejść do "Funkcje", a następnie "Funkcje wywoływania", a prawie natychmiast usłyszysz o funcall.

+1

Jesteś na fali. Świetne odpowiedzi. –

+0

Mój przykład był źle wybrane, przepraszam: Chcę użyć dostosować do, powiedzmy pozwolić użytkownikowi wybrać swój program pocztowy, tak:. '(defcustom mój mailowy programu„gnu”polecenia „klient poczty Przykład : wl " : wpisz 'ciąg : grupa' mail-bugger)' Nie mogę wykonać programu (my-mail-program) ..? – yPhil

+1

Powinieneś więc użyć funkcji ': type 'zamiast' 'string', z domyślną wartością'' gnus' zamiast '' gnus "', a następnie użyj '(funcall my-mail-program)' . Upewnij się, że rozumiesz różnicę między ciągiem a symbolem. – phils

15

Aby uruchomić funkcję zapisaną w zmiennej można użyć funcall

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

(defvar my-function 'dumb-f) 

(funcall my-function) 
==> "I'm a function" 
Powiązane problemy