Jaka jest różnica między funkcją a poleceniem?

35

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?

itsjeyd
źródło
13
Oczywiście masz do tego pełne prawo i jestem pewien, że niektórym ludziom to pomoże. Ale FWIW nie popieram tutaj pytań i odpowiedzi w przypadku każdej drobiazgi, w której lepiej byłoby nauczyć kogoś, aby pytał samego Emacsa . To jedno z nich, IMO - nie jest trudno się tego dowiedzieć, a Emacs daje dobrą odpowiedź. C-h i, wybierz instrukcję Elisp , i command- ustawia cię prosto w węźle What is a function?, dzięki czemu wszystko jest krystalicznie czyste. Pomóż użytkownikom nauczyć się pytać Emacsa. (Tylko jedna opinia.)
Drew
1
To powiedziawszy, dobrze postawiłeś i odpowiedziałeś na pytanie.
Drew
5
@Drew Zgadzam się w 100% na nauczaniu ludzi, aby najpierw pytali Emacsa. Głównym celem tego konkretnego pytania i odpowiedzi jest ułatwienie promowania prawidłowego używania terminów oraz, w razie potrzeby, uświadomienie użytkownikom różnic między poleceniami i funkcjami: czasami ludzie nie zdają sobie sprawy, że to pytanie, które powinni zadać , posiadanie ogólnego zasobu do wskazania ich jest łatwiejsze niż powtarzanie tej samej treści w komentarzach.
itsjeyd
1
To powiedziawszy, dziękuję za wspomnienie, jak znaleźć odpowiednie informacje w Emacsie :)
itsjeyd
1
Zgadzamy się - chodzi o pomoc użytkownikom w korzystaniu z Emacsa. Ta strona jest środkiem do tego celu.
Drew

Odpowiedzi:

44

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-x name-of-command RET, a także można je przypisać do sekwencji klawiszy. Zwykłe funkcje nie zawierają wywołania interactive, 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) RET

Jeśli funkcja nie powinna działać na bieżącym buforze, możesz również wprowadzić

(name-of-function arg1 arg2 arg3)

w *scratch*buforze i naciśnij C-x C-e( eval-last-sexp) z punktem umieszczonym po nawiasie zamykającym.

Aby funkcja była bardostępna jako polecenie, możesz ją owinąć w niestandardową funkcję interaktywną ( foo) w następujący sposób:

(defun foo ()
  (interactive)
  (bar))

Oczywiście, jeśli barprzyjmiesz jeden lub więcej argumentów, będziesz musiał je podać, aby foodział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 defuns tutaj. Jak wskazuje @Stefan w komentarzach, makra klawiaturowe są szczególnym przypadkiem: można je traktować jako polecenia , ale nie są funkcjami.

itsjeyd
źródło
5
Drobny nitpick: interactive„wywołania” są zwykle nazywane deklaracjami (sama funkcja w rzeczywistości nic nie robi).
shosti
5
@itsjeyd: Właściwie nie, są też polecenia, które nie są funkcjami. Dotyczy to makr klawiaturowych . Np. M-: (commandp [?a]) RETPowie (korelacja), że [?a]jest to polecenie, ale nie jest to funkcja.
Stefan
@Stefan Dzięki za wskazanie tego. Zaktualizowałem swoją odpowiedź.
itsjeyd