ความแตกต่างระหว่างฟังก์ชั่นและคำสั่งคืออะไร?


35

เมื่อโพสต์คำถามและคำตอบที่นี่บางครั้งผู้คนก็ใช้คำว่า "ฟังก์ชั่น" และ "คำสั่ง" แทนกันได้ ในกรณีอื่น ๆ ผู้คนใช้เพียงหนึ่งในสองคำเพื่อหารือเกี่ยวกับรหัสเฉพาะ เนื่องจากโพสต์มักจะเน้นที่หัวข้ออื่นพวกเขาไม่ได้อธิบายว่าทำไมพวกเขาจึงใช้ศัพท์หนึ่ง แต่ไม่ใช่อีกหัวข้อหนึ่ง ดังนั้น:

ถาม:ใน Emacs Lisp ความแตกต่างระหว่างฟังก์ชั่นและคำสั่งคืออะไร?


13
แน่นอนคุณมีสิทธิ์ที่จะทำเช่นนั้นและฉันมั่นใจว่าบางคนจะได้รับความช่วยเหลือ แต่ FWIW ฉันไม่ได้อยู่ในความโปรดปรานของ Q & A ที่นี่สำหรับทุกสิ่งเล็กน้อยว่ามันอาจจะดีกว่าที่จะสอนคนที่จะถามตัวเอง Emacsเกี่ยว นี่เป็นหนึ่งเช่น IMO - มันไม่ยากที่จะหาคำตอบและ Emacs ให้คำตอบที่ดี C-h iเลือกคู่มือ Elisp , i command- ทำให้คุณสิทธิในโหนดWhat is a function?ซึ่งทำให้ทั้งหมดของคริสตัลที่ชัดเจนแบบนี้ ช่วยให้ผู้ใช้เรียนรู้ที่จะถาม Emacs (เพียงหนึ่งความเห็น.)
Drew

1
ที่กล่าวว่าคุณโพสต์และตอบคำถามได้ดี
Drew

5
@ ดึงฉันเห็นด้วย 100% ในการสอนคนให้ถาม Emacs ก่อน วัตถุประสงค์หลักของการนี้โดยเฉพาะ Q & A คือการทำให้มันง่ายต่อการส่งเสริมการใช้ที่ถูกต้องของคำและเพื่อให้ผู้ใช้ตระหนักถึงความแตกต่างระหว่างคำสั่งและฟังก์ชั่นในกรณีที่จำเป็น: บางครั้งคนที่ไม่ทราบว่านี่เป็นคำถามที่พวกเขาควรจะถาม , และการมีแหล่งข้อมูลทั่วไปเพื่อชี้ให้พวกเขานั้นง่ายกว่าการทำซ้ำเนื้อหาเดิมซ้ำไปซ้ำมาในความคิดเห็น
itsjeyd

1
ที่กล่าวว่าขอขอบคุณสำหรับการกล่าวขวัญวิธีการค้นหาข้อมูลภายในที่เกี่ยวข้องของ Emacs :)
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จะ (correclty) บอกคุณว่า[?a]เป็นคำสั่ง แต่มันไม่ใช่ฟังก์ชั่น
สเตฟาน

@ สเตฟานขอบคุณสำหรับการชี้ให้เห็นว่า ฉันปรับปรุงคำตอบของฉัน
itsjeyd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.