Apa perbedaan antara fungsi dan perintah?

35

Saat memposting pertanyaan dan jawaban di sini, orang kadang menggunakan istilah "fungsi" dan "perintah" secara bergantian. Dalam kasus lain, orang hanya menggunakan salah satu dari dua istilah untuk membahas potongan kode tertentu. Karena posting mereka biasanya fokus pada topik lain, mereka tidak menjelaskan mengapa mereka menggunakan satu istilah tetapi tidak yang lain. Begitu:

T: Dalam Emacs Lisp, apa perbedaan antara fungsi dan perintah?

itu hanya
sumber
13
Anda punya hak untuk melakukannya, tentu saja, dan saya yakin beberapa orang akan terbantu dengan ini. Tapi FWIW saya tidak mendukung T&J di sini untuk setiap hal kecil yang mungkin lebih baik untuk mengajar seseorang untuk bertanya tentang Emacs sendiri . Ini salah satunya, IMO - tidak sulit untuk menemukan ini, dan Emacs memberikan jawaban yang bagus. C-h i, pilih manual Elisp , i command- menempatkan Anda tepat di simpul What is a function?, yang membuat semua ini sangat jelas. Bantu pengguna belajar bertanya pada Emacs. (Hanya satu pendapat.)
Drew
1
Yang mengatakan, Anda mengajukan dan menjawab pertanyaan dengan baik.
Drew
5
@Drew Saya setuju 100% mengajar orang untuk bertanya pada Emacs terlebih dahulu. Tujuan utama dari Tanya Jawab khusus ini adalah untuk membuatnya lebih mudah untuk mempromosikan penggunaan istilah yang benar dan untuk membuat pengguna sadar akan perbedaan antara perintah dan fungsi jika perlu: Kadang-kadang, orang tidak menyadari bahwa ini adalah pertanyaan yang harus mereka tanyakan , dan memiliki sumber daya umum untuk mengarahkan mereka lebih mudah daripada mengulangi konten yang sama berulang-ulang di komentar.
itsjeyd
1
Yang mengatakan, terima kasih telah menyebutkan bagaimana menemukan informasi yang relevan di dalam Emacs :)
itsjeyd
1
Kami setuju - ini tentang membantu pengguna menggunakan Emacs. Situs ini adalah sarana untuk mencapai tujuan itu.
Drew

Jawaban:

44

Setiap perintah adalah fungsi, tetapi tidak setiap fungsi juga merupakan perintah. 1

Perintah termasuk panggilan ke interactive; inilah sebabnya perintah biasanya disebut sebagai "fungsi interaktif". Perintah dapat dipanggil melalui M-x name-of-command RET, dan mereka juga dapat terikat pada urutan kunci. Fungsi reguler tidak termasuk panggilan ke interactive, tidak bisa dipanggil menggunakan M-x, dan Anda tidak dapat mengikatnya ke urutan tombol. Untuk menjalankan fungsi yang tidak interaktif, Anda dapat menekan M-:( eval-expression), masukkan nama fungsi yang diikuti oleh nilai untuk setiap argumen yang perlu dilampirkan dalam tanda kurung, dan tekan RET:

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

Jika fungsi ini tidak seharusnya beroperasi pada buffer saat ini, Anda juga bisa masuk

(name-of-function arg1 arg2 arg3)

di *scratch*buffer dan tekan C-x C-e( eval-last-sexp) dengan titik diposisikan setelah tanda kurung tutup.

Untuk membuat fungsi bartersedia sebagai perintah, Anda dapat membungkusnya dengan fungsi interaktif khusus ( foo) sebagai berikut:

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

Tentu saja, jika barmengambil satu atau lebih argumen, Anda harus menyediakannya untuk membuat foopekerjaan dengan benar.

Jika Anda melihat orang menggunakan istilah "fungsi" dan "perintah" secara bergantian, ini mungkin menunjukkan (tergantung pada konteks) bahwa mereka tidak menyadari perbedaan antara konsep-konsep yang mendasarinya.


1 Perhatikan bahwa saya sedang berbicara tentang defundi sini. Seperti @Stefan tunjukkan dalam komentar, makro keyboard adalah kasus khusus: Mereka dapat dianggap sebagai perintah , tetapi mereka bukan fungsi.

itu hanya
sumber
5
Nitpick kecil: interactive"panggilan" biasanya disebut deklarasi (fungsi itu sendiri sebenarnya tidak melakukan apa-apa).
shosti
5
@itsjeyd: Sebenarnya, tidak, ada juga perintah yang tidak berfungsi. Ini adalah kasus untuk makro keyboard . Misal M-: (commandp [?a]) RETwill (correclty) memberi tahu Anda bahwa itu [?a]adalah perintah, tetapi itu bukan fungsi.
Stefan
@Stefan Terima kasih telah menunjukkannya. Saya memperbarui jawaban saya.
itsjeyd