#'
chỉ là tốc ký cho function
, cũng như tốc '
ký quote
.
Bạn có thể sử dụng nó ở bất cứ nơi nào bạn muốn chỉ ra cho trình biên dịch byte hoặc trình thông dịch hoặc trình đọc của con người rằng đối số của nó được dự kiến là (được coi là) một hàm.
Trong nhiều bối cảnh, bối cảnh xác định cách đối số được xử lý nếu, ví dụ, bạn chỉ cần trích dẫn nó (sử dụng quote
hoặc '
) thay vì sử dụng #'
(hoặc function
). Ví dụ, trong ngữ cảnh chỉ sử dụng một ký hiệu cho thuộc tính của nó symbol-function
, nghĩa là nó được sử dụng như một hàm, bạn chỉ có thể truyền ký hiệu (ví dụ: bằng cách trích dẫn nó hoặc truyền một biến có giá trị là ký hiệu).
Nhưng đôi khi mã sẽ rõ ràng hơn nếu bạn sử dụng #'
trong các bối cảnh như vậy. Ngay cả khi chính Emacs-Lisp hiểu rằng biểu tượng được sử dụng như một hàm trong các bối cảnh như vậy, nó có thể giúp nhấn mạnh điều này cho người đọc mã của con người.
Trong một số Lisps khác, việc xử lý các dạng lambda được trích dẫn đơn giản (với '
) hoặc không được trích dẫn có thể khác với việc sử dụng chúng ở vị trí hàm khi được trích dẫn bằng cách sử dụng function
( #'
). Nhưng không phải trong Emacs Lisp. Trong Emacs Lisp, bạn không cần trích dẫn (sử dụng '
hoặc #'
) một biểu mẫu lambda mà bạn muốn được coi là một hàm (và không chỉ đơn giản là một danh sách). Nếu bạn muốn nó được xử lý như một danh sách, với xe hơi lambda
, v.v., thì hãy trích dẫn nó (với '
) - ví dụ dưới đây minh họa điều này.
Từ (elisp) Hàm ẩn danh :
- Mẫu đặc biệt: function
function-object
Hình thức đặc biệt này trả về FUNCTION-OBJECT
mà không đánh giá nó.
Trong đó, nó tương tự như quote
(* chú thích Trích dẫn: :). Nhưng không giống như
quote
, nó cũng đóng vai trò là một ghi chú cho trình đánh giá Emacs và trình biên dịch byte FUNCTION-OBJECT
được dự định sẽ được sử dụng như một hàm. Giả sử FUNCTION-OBJECT
là một biểu thức lambda hợp lệ, điều này có hai tác dụng:
• Khi mã được biên dịch byte, FUNCTION-OBJECT
được biên dịch thành đối tượng hàm mã byte (* lưu ý Byte Compilation: :).
• Khi liên kết từ vựng được bật, FUNCTION-OBJECT
được chuyển thành đóng. * Lưu ý Đóng ::.
Cú pháp đọc #'
là một tay ngắn để sử dụng function
. Các hình thức sau đây đều tương đương:
(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))
Trong ví dụ sau, chúng tôi định nghĩa một change-property
hàm lấy một hàm làm đối số thứ ba của nó, theo sau là một double-property
hàm sử dụng change-property
bằng cách chuyển cho nó một hàm ẩn danh:
(defun change-property (symbol prop function)
(let ((value (get symbol prop)))
(put symbol prop (funcall function value))))
(defun double-property (symbol prop)
(change-property symbol prop (lambda (x) (* 2 x))))
Lưu ý rằng chúng tôi không trích dẫn lambda
mẫu.
Nếu bạn biên dịch mã trên, hàm ẩn danh cũng được biên dịch. Điều này sẽ không xảy ra nếu, giả sử, bạn đã xây dựng hàm ẩn danh bằng cách trích dẫn nó dưới dạng danh sách:
(defun double-property (symbol prop)
(change-property symbol prop '(lambda (x) (* 2 x))))
Trong trường hợp đó, hàm ẩn danh được giữ dưới dạng biểu thức lambda trong mã được biên dịch. Trình biên dịch byte không thể coi danh sách này là một hàm, mặc dù nó trông giống như một hàm, vì nó không biết rằng nó
change-property
có ý định sử dụng nó như là một hàm.