Sự khác biệt giữa một chức năng và một lệnh là gì?


35

Khi đăng câu hỏi và câu trả lời ở đây, đôi khi người ta sử dụng thuật ngữ "chức năng" và "lệnh" thay thế cho nhau. Trong các trường hợp khác, mọi người chỉ sử dụng một trong hai thuật ngữ để thảo luận về các đoạn mã cụ thể. Vì bài đăng của họ thường tập trung vào các chủ đề khác, họ không giải thích lý do tại sao họ sử dụng một thuật ngữ mà không phải là thuật ngữ khác. Vì thế:

Q: Trong Emacs Lisp, sự khác biệt giữa hàm và lệnh là gì?


13
Bạn có mọi quyền để làm như vậy, tất nhiên, và tôi chắc chắn một số người sẽ được giúp đỡ bởi điều này. Nhưng FWIW tôi không ủng hộ Q & A ở đây vì mọi điều nhỏ nhặt có thể tốt hơn là dạy ai đó hỏi chính Emacs về . IMO là một thứ như vậy - không khó để tìm ra điều này và Emacs đưa ra một câu trả lời hay. C-h i, chọn hướng dẫn Elisp , i command- đặt bạn ngay vào nút What is a function?, điều này làm cho tất cả các tinh thể này rõ ràng. Giúp người dùng tìm hiểu để hỏi Emacs. (Chỉ một ý kiến.)
vẽ

1
Điều đó nói rằng, bạn đặt ra và trả lời câu hỏi tốt.
vẽ

5
@Drew Tôi đồng ý 100% về việc dạy mọi người hỏi Emacs trước. Mục đích chính của Q & A cụ thể này là để giúp dễ dàng hơn trong việc thúc đẩy sử dụng chính xác các thuật ngữ và giúp người dùng nhận thức được sự khác biệt giữa các lệnh và chức năng nếu cần: Đôi khi, mọi người không biết rằng đây là câu hỏi họ nên hỏi , và có một tài nguyên chung để chỉ ra chúng dễ dàng hơn việc lặp đi lặp lại cùng một nội dung trong các bình luận.
itjeyd

1
Điều đó nói rằng, cảm ơn vì đã đề cập đến cách tìm thông tin liên quan bên trong Emacs :)
itjeyd

1
Chúng tôi đồng ý - đó là về việc giúp người dùng sử dụng Emacs. Trang web này là một phương tiện để kết thúc đó.
vẽ

Câu trả lời:


44

Mỗi lệnh là một chức năng, nhưng không phải mọi chức năng cũng là một lệnh. 1

Một lệnh bao gồm một cuộc gọi đến interactive; đây là lý do tại sao các lệnh thường được gọi là "các chức năng tương tác". Các lệnh có thể được gọi thông qua M-x name-of-command RETvà chúng cũng có thể được liên kết với một chuỗi khóa. Các hàm thông thường không bao gồm lệnh gọi interactive, không thể được gọi bằng cách sử dụng M-xvà bạn không thể liên kết chúng với một chuỗi khóa. Để chạy một hàm không tương tác, bạn có thể nhấn M-:( eval-expression), nhập tên của hàm theo sau là các giá trị cho bất kỳ đối số nào nó cần được đặt trong ngoặc đơn và nhấn RET:

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

Nếu chức năng không được phép hoạt động trên bộ đệm hiện tại, bạn cũng có thể nhập

(name-of-function arg1 arg2 arg3)

trong *scratch*bộ đệm và nhấn C-x C-e( eval-last-sexp) với điểm được định vị sau dấu ngoặc đơn đóng.

Để cung cấp một hàm barcó sẵn dưới dạng một lệnh, bạn có thể gói nó trong một hàm tương tác tùy chỉnh ( foo) như sau:

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

Tất nhiên, nếu barmất một hoặc nhiều đối số, bạn sẽ phải cung cấp chúng để thực hiện foocông việc chính xác.

Nếu bạn thấy mọi người sử dụng thuật ngữ "chức năng" và "lệnh" có thể hoán đổi cho nhau, điều này có thể cho thấy (tùy thuộc vào ngữ cảnh) rằng họ không nhận thức được sự khác biệt giữa các khái niệm cơ bản.


1 Lưu ý rằng tôi đang nói về defuns ở đây. Như @Stefan chỉ ra trong các bình luận, macro bàn phím là một trường hợp đặc biệt: Chúng có thể được coi là các lệnh , nhưng chúng không phải là chức năng.


5
Các nitlog nhỏ: interactive"các cuộc gọi" thường được gọi là khai báo (chính hàm này không thực sự làm gì cả).
shosti

5
@itsjeyd: Thật ra, không, cũng có những lệnh không phải là hàm. Đây là trường hợp cho các macro bàn phím . Ví dụ, M-: (commandp [?a]) RETwill (Correclty) sẽ cho bạn biết đó [?a]là một lệnh, nhưng nó không phải là một hàm.
Stefan

@Stefan Cảm ơn bạn đã chỉ ra điều đó. Tôi cập nhật câu trả lời của tôi.
itjeyd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.