Titik intinya adalah bahwa ada perbedaan antara fungsi dan perintah .
Dalam Emacs lisp, fungsi tidak dapat dipanggil secara interaktif secara default. Itu berarti Anda tidak dapat mengaksesnya melalui M-xatau mengikat mereka ke tombol atau klik mouse. Jika Anda ingin melakukan itu, Anda harus secara eksplisit mendeklarasikan fungsi tersebut interactive, yang Anda lakukan dengan menambahkan (interactive)formulir sebagai baris pertama dalam tubuh (mengikuti string dokumentasi). Fungsi interaktif disebut perintah. Ini dijelaskan dalam manual: (info "(elisp) Using Interactive") (versi online) .
Pesan kesalahan yang Anda lihat,, Wrong type argument: commandp, my-functionmenunjukkan bahwa Anda mencoba memanggil suatu fungsi secara interaktif, tetapi fungsi itu bukan perintah .
Untuk menjelaskan kesalahan yang sebenarnya, surat pitu sering digunakan dalam lisp untuk menunjukkan predikat atau tes. Dalam kasus ini, Emacs sedang menguji my-functionuntuk melihat apakah itu adalah perintah menggunakan tes commandp. Bukan, yang mengarah ke kesalahan. Kesalahan serupa muncul setiap kali Anda menggunakan objek dengan tipe yang salah: jika Emacs mengharapkan string dan Anda melewati simbol, Anda mungkin melihat referensi stringp, misalnya.
Untuk menjawab pertanyaan saat ditanyakan, Anda perlu menambahkan (interactive)baris ke definisi:
(defun my-function ()
(interactive)
(message "This is a great function"))
Ada banyak opsi untuk interactiveformulir, mendukung semua jenis cara menyampaikan informasi ke fungsi Anda. Periksa manual untuk semua detail.
Makro keyboard adalah kasus khusus dalam konteks ini. Makro keyboard adalah urutan acara input, direpresentasikan sebagai string. Makro keyboard berperilaku seperti perintah, sehingga Anda dapat mengikatnya ke tombol tanpa khawatir menambahkan interactivedeklarasi. Misalnya, berikut ini:
(global-set-key (kbd "C-c l") "λ")
"λ"adalah makro keyboard, jadi kita dapat mengikatnya C-c ltanpa masalah. Jika kita mencoba melakukan hal yang sama dengan suatu fungsi, kita harus memastikan untuk mendefinisikan fungsi sebagai interactive:
(global-set-key (kbd "C-c k")
(lambda () (insert "λ"))
;; C-c k is undefined! We tried to bind it to a function
(global-set-key (kbd "C-c m")
(lambda () (interactive) (insert "λ"))
;; C-c m is bound to a command that inserts λ