함수와 명령의 차이점은 무엇입니까?


35

여기에 질문과 답변을 게시 할 때 사람들은 때때로 "기능"과 "명령"이라는 용어를 서로 바꿔서 사용합니다. 다른 경우, 사람들은 두 가지 용어 중 하나만 사용하여 특정 코드 조각에 대해 논의합니다. 게시물은 일반적으로 다른 주제에 초점을 맞추기 때문에 한 용어를 사용하지만 다른 용어는 사용하지 않는 이유를 설명하지 않습니다. 그래서:

Q : Emacs Lisp에서 함수와 명령의 차이점은 무엇입니까?


13
물론 그렇게 할 수있는 모든 권리가 있으며, 이로 인해 일부 사람들이 도움을받을 것이라고 확신합니다. 그러나 FWIW 저는 누군가 에게 Emacs 에 대해 물어 보는 것이 더 좋을 수도있는 모든 작은 일에 대해 Q & A를 선호하지 않습니다 . 이것은 IMO 중 하나입니다.이를 찾기가 어렵지 않으며 Emacs는 좋은 대답을합니다. C-h i, 선택 Elisp 설명서를 , i command- 바로 노드 풋을 What is a function?분명이 결정의 전부를 만든다. 사용자가 Emacs를 묻는 법을 배우도록 도와줍니다. (단 한 의견)
Drew

1
즉, 당신은 질문을 잘 제기하고 대답했습니다.
Drew

5
@Drew 저는 사람들에게 Emacs를 먼저 요청하도록 가르치는 것에 100 % 동의합니다. Q & A는이 특정의 주요 목적은 쉽게 용어의 올바른 사용을 촉진하고 명령과 기능의 차이 사용자가 인식하도록 만들기 위해 필요한 경우 : 가끔 사람들이 이 그들이 요구한다 질문임을 인식하지 , 주석에서 동일한 내용을 반복해서 반복하는 것보다 그것들을 가리키는 일반적인 리소스를 갖는 것이 더 쉽습니다.
itsjeyd

1
말했다 즉, 이맥스의 관련 정보의 내부를 찾는 방법을 언급 주셔서 감사합니다 :)
itsjeyd

1
우리는 사용자가 Emacs를 사용하도록 돕는 것에 동의합니다. 이 사이트는 그 목적을위한 수단입니다.
Drew

답변:


44

모든 명령은 함수이지만 모든 기능도 명령은 아닙니다. 1

명령에는 다음에 대한 호출이 포함됩니다 interactive. 이런 이유로 명령을 "대화식 기능"이라고합니다. 를 통해 명령을 호출 할 수 있으며 M-x name-of-command RET키 시퀀스에 바인딩 할 수도 있습니다. 정기적 인 기능을 할 수 없습니다 호출을 포함 interactive, 수 없습니다 사용하여 호출 할 수 M-x, 당신은 키 순서로 할 수 없습니다 결합 그들. 대화식이 아닌 함수를 실행하려면 M-:( eval-expression)를 누르고 함수 이름 다음에 괄호로 묶어야하는 인수의 값을 입력 한 후 다음을 누르십시오 RET.

M-: (name-of-function arg1 arg2 arg3) RET

함수가 현재 버퍼에서 작동하지 않으면 다음을 입력 할 수도 있습니다.

(name-of-function arg1 arg2 arg3)

*scratch*버퍼 에서 괄호 뒤에 점을두고 C-x C-e( eval-last-sexp)를 누릅니다 .

기능을 bar명령으로 사용 가능 하게하려면 foo다음과 같이 사용자 정의 대화식 기능 ( )으로 랩핑 할 수 있습니다 .

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

물론, bar하나 이상의 인수가 필요한 경우 foo올바르게 작동 하려면 인수를 제공해야 합니다.

"함수"와 "명령"이라는 용어를 서로 바꾸어 사용하는 사람들을 본다면, 이는 상황에 따라 기본 개념의 차이점을 인식하지 못하는 것을 나타낼 수 있습니다 .


1 나는 defun여기서 이야기하고 있습니다. 주석에서 @Stefan이 지적한 것처럼 키보드 매크로 는 특별한 경우입니다. 명령으로 간주 될 수 는 있지만 기능은 아닙니다.


5
작은 nitpick : interactive"호출"은 일반적으로 선언이라고합니다 (함수 자체는 실제로 아무것도하지 않습니다).
shosti

5
@itsjeyd : 사실, 아닙니다. 기능이 아닌 명령도 있습니다. 키보드 매크로 의 경우입니다 . 예 M-: (commandp [?a]) RET를 들어 (정확한) [?a]명령이라고 말하지만 기능은 아닙니다.
Stefan

@Stefan 지적 해 주셔서 감사합니다. 내 답변을 업데이트했습니다.
itsjeyd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.