ここに質問と回答を投稿するとき、人々は「機能」と「コマンド」という用語を同じ意味で使用することがあります。その他の場合、人々は2つの用語のうちの1つだけを使用して、特定のコードを議論します。彼らの投稿は通常他のトピックに焦点を合わせているため、ある用語を使用しているのに他の用語を使用していない理由を説明していません。そう:
Q: Emacs Lispでは、関数とコマンドの違いは何ですか?
ここに質問と回答を投稿するとき、人々は「機能」と「コマンド」という用語を同じ意味で使用することがあります。その他の場合、人々は2つの用語のうちの1つだけを使用して、特定のコードを議論します。彼らの投稿は通常他のトピックに焦点を合わせているため、ある用語を使用しているのに他の用語を使用していない理由を説明していません。そう:
Q: Emacs Lispでは、関数とコマンドの違いは何ですか?
回答:
すべてのコマンドは機能ですが、すべての機能がコマンドでもあるわけではありません。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
1つ以上の引数を取る場合、foo
正しく動作させるためにそれらを指定する必要があります。
「機能」と「コマンド」という用語を同じ意味で使用している人がいる場合、これは(コンテキストに応じて)基礎となる概念の違いを認識していないことを示している可能性があります。
1ここでについて話していることに注意してdefun
ください。@Stefanがコメントで指摘しているように、キーボードマクロは特殊なケースです。コマンドと見なすことができますが、機能ではありません。
interactive
「呼び出し」は通常、宣言と呼ばれます(関数自体は実際には何もしません)。
M-: (commandp [?a]) RET
(正しい)[?a]
コマンドであることはわかりますが、関数ではありません。
C-h i
、Elispマニュアルを選択します。i command
-nodeWhat is a function?
に移動すると、このすべてが明確になります。ユーザーがEmacsに尋ねることを学ぶのを助けます。(1つだけの意見。)