Publikując tutaj pytania i odpowiedzi, ludzie czasami używają terminów „funkcja” i „komenda” zamiennie. W innych przypadkach ludzie używają tylko jednego z dwóch terminów do omawiania określonych fragmentów kodu. Ponieważ ich posty zwykle koncentrują się na innych tematach, nie wyjaśniają, dlaczego używają jednego terminu, ale nie drugiego. Więc:
P: Jaka jest różnica między funkcją a poleceniem w Emacs Lisp?
C-h i
, wybierz instrukcję Elisp ,i command
- ustawia cię prosto w węźleWhat is a function?
, dzięki czemu wszystko jest krystalicznie czyste. Pomóż użytkownikom nauczyć się pytać Emacsa. (Tylko jedna opinia.)Odpowiedzi:
Każde polecenie jest funkcją, ale nie każda funkcja jest także poleceniem. 1
Polecenie obejmuje połączenie z
interactive
; dlatego polecenia są powszechnie nazywane „funkcjami interaktywnymi”. Polecenia można wywoływać za pomocą M-xname-of-command
RET, a także można je przypisać do sekwencji klawiszy. Zwykłe funkcje nie zawierają wywołaniainteractive
, nie można ich wywołać za pomocą M-xi nie można ich przypisać do sekwencji klawiszy. Aby uruchomić funkcję, która nie jest interaktywna, możesz nacisnąć M-:(eval-expression
), wprowadzić nazwę funkcji, a następnie wartości argumentów, które muszą być zawarte w nawiasach, i nacisnąć RET:M-:
(name-of-function arg1 arg2 arg3)
RETJeśli funkcja nie powinna działać na bieżącym buforze, możesz również wprowadzić
w
*scratch*
buforze i naciśnij C-x C-e(eval-last-sexp
) z punktem umieszczonym po nawiasie zamykającym.Aby funkcja była
bar
dostępna jako polecenie, możesz ją owinąć w niestandardową funkcję interaktywną (foo
) w następujący sposób:Oczywiście, jeśli
bar
przyjmiesz jeden lub więcej argumentów, będziesz musiał je podać, abyfoo
działać poprawnie.Jeśli zobaczysz, że ludzie używają terminów „funkcja” i „komenda” zamiennie, może to oznaczać (w zależności od kontekstu), że nie są świadomi różnic między podstawowymi pojęciami.
1 Zauważ, że mówię o
defun
s tutaj. Jak wskazuje @Stefan w komentarzach, makra klawiaturowe są szczególnym przypadkiem: można je traktować jako polecenia , ale nie są funkcjami.źródło
interactive
„wywołania” są zwykle nazywane deklaracjami (sama funkcja w rzeczywistości nic nie robi).M-: (commandp [?a]) RET
Powie (korelacja), że[?a]
jest to polecenie, ale nie jest to funkcja.