Bir işlev ile bir komut arasındaki fark nedir?


35

Burada soru ve cevap gönderirken, insanlar bazen "işlev" ve "komut" terimlerini birbirlerinin yerine kullanırlar. Diğer durumlarda, insanlar belirli kod parçalarını tartışmak için iki terimden yalnızca birini kullanır. Yazıları genellikle diğer konulara odaklandığı için neden bir terim kullandıklarını açıklamıyorlar, diğeri değil. Yani:

S: Emacs Lisp'te bir fonksiyon ile bir komut arasındaki fark nedir?


13
Elbette, bunu yapmaya hakkınız var ve eminim ki bazı insanlar bu konuda yardımcı olacaktır. Ama FWIW Birine Emacs'a kendisini sormasını öğretmek için daha iyi olabilecek her küçük şey için burada Q & A'nın lehine değilim . Bu böyle bir, IMO - bunu bulmak zor değil ve Emacs iyi bir cevap veriyor. C-h i, Elisp el kitabını seçin , i command- sizi What is a function?tüm bu kristalin netleştireceği düğüme sokar . Kullanıcıların Emacs'a sormayı öğrenmelerine yardımcı olun. (Sadece bir görüş.)
Drew

1
Yani, soruyu iyi cevapladın ve cevapladın.
Drew

5
@Drew İnsanlara ilk olarak Emacs'a sormalarını öğretme konusunda% 100 katılıyorum. Q & A bu özgü temel amacı daha kolay terimlerin doğru kullanımını teşvik etmek ve komutlar ve işlevleri arasındaki farkların kullanıcıları haberdar etmek yapmaya gerekirse: Bazen insanlar bu onlar sormanız gereken bir soru olduğunun farkında değil , ve onları işaret edecek genel bir kaynağa sahip olmak, yorumlarda aynı içeriği tekrar tekrar tekrarlamaktan daha kolaydır.
saat

1
Dedi ki, Emacs ilgili bilgiler içini nasıl bulunacağı söz için teşekkürler :)
itsjeyd

1
Kabul ediyoruz - kullanıcıların Emacs kullanmasına yardımcı olmakla ilgili. Bu site bunun için bir araçtır.
Drew

Yanıtlar:


44

Her komut bir fonksiyondur, fakat her fonksiyon bir komuttur. 1

Bir komut bir çağrı içerir interactive; Bu nedenle komutlara genellikle "etkileşimli işlevler" denir. Komutlar aracılığıyla çağrılabilir M-x name-of-command RETve ayrıca bir anahtar diziye bağlanabilirler. Düzenli fonksiyonlar do not Aşağıdaki örnekte gösterildiği gibi interactive, olabilir değil kullanılarak çağrılabilir M-xve bir anahtar dizisine olamaz bağlamak onları. Etkileşimli olmayan bir işlevi çalıştırmak için M-:( eval-expression) tuşuna basabilir , parantez içine alması gereken bağımsız değişkenlerin arkasındaki değerleri izleyerek işlevin adını girebilir ve RET:

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

Fonksiyonun mevcut tamponda çalışması gerekmiyorsa, ayrıca

(name-of-function arg1 arg2 arg3)

içinde *scratch*tampon ve basın C-x C-e( eval-last-sexpnoktası ile) kapatma parantez sonra konumlandırılmış.

Bir işlevi barkomut olarak kullanılabilir hale getirmek için , onu özel bir etkileşimli işlevde ( foo) aşağıdaki gibi sarabilirsiniz :

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

Elbette, barbir veya daha fazla argüman alırsa , foodoğru çalışması için onları sağlamanız gerekir .

Eğer terimleri "fonksiyon" ve birbirlerinin yerine "komutu" seçeneğini kullanarak insanları görürseniz, bu olabilir onlar altta yatan kavramlar arasındaki farkların farkında olmadıklarını (bağlama göre) göstermektedir.


1defun Burada bahsettiğimi not edin . @Stefan yorumlarda da belirtildiği gibi, klavye makroları özel bir durumdur: Komut olarak kabul edilebilirler , ancak işlev değildirler.


5
Küçük nitpick: interactive"çağrılar" genellikle bildirimler olarak adlandırılır (işlevin kendisi aslında hiçbir şey yapmaz).
Shosti

5
@ itsjeyd: Aslında hayır, fonksiyon olmayan komutlar da var. Bu klavye makroları için geçerlidir . Örneğin M-: (commandp [?a]) RET, will (correclty) size bunun [?a]bir komut olduğunu söyler , ancak bu bir fonksiyon değildir.
Stefan,

@Stefan Buna dikkat çektiğiniz için teşekkürler. Cevabımı güncelledim.
itsjeyd,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.