Có sự khác biệt nào giữa `# '(lambda…` và `(lambda…` không? [Trùng lặp]
Dec 14 2020
Trong Lisp chung thực tế, có một ví dụ về REMOVE-IF-NOTvới lambda:
CL-USER> (remove-if-not #'(lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)
Điều này có khác với:
CL-USER> (remove-if-not (lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)
Là một (lambda..)giá trị trùng với hình thức trích dẫn chức năng #'(..)? Trên REPL thì có vẻ như vậy, nhưng vì tôi là người mới làm quen với Lisp, tôi có thể bỏ qua một số thứ (và chắc chắn tôi đã hiểu sai nguyên văn, vì vậy hãy sửa cho tôi về điều đó).
Trả lời
4 tfb Dec 14 2020 at 19:03
Hai điều này, như bạn nghi ngờ, giống nhau:
#'là một macro đọc và#'xđược đọc là(function x). Vì vậy,#'(lambda (...) ...)được đọc là(function (lambda (...) ...)), đâufunctionlà toán tử đặc biệt trong CL nói rằng đối số của nó biểu thị một hàm;lambdađược định nghĩa là một macro: mở rộng của(lambda (...) ...)là(function (lambda (...) ...): dạng giống hệt với dạng trước đó.
Điều này có nghĩa là #'(lambda (...) ...), (lambda (...) ...)và (function (lambda (...) ...))tất cả đều giống nhau trong CL: chúng đều biểu thị chức năng được chỉ định bởi (lambda (...) ...)môi trường từ vựng hiện tại.
Có hai lý do tại sao mọi người vẫn có thể sử dụng #'(lambda (...) ...)phiên bản:
- nhất quán - bạn cần, ví dụ
#'foonếufoolà một hàm, vì vậy nó có thể được coi là nhất quán hơn khi sử dụng nó cholambdatrường hợp; - Không phải lúc nào CL
lambdacũng có định nghĩa macro như bây giờ, vì vậy mã được viết giữa đặc tả CL gốc và tiêu chuẩn ANSI, hoặc được viết bởi những người nhớ những thời điểm đó, có thể sử dụng#'biểu mẫu.