Một chức năng là gì?
Để hiểu tại sao điều này xảy ra, chúng ta cần biết chức năng là gì. Khi đánh giá dạng lisp (myfunc arg1 arg2 ...)
, trước tiên emacs kiểm tra xem đó myfunc
là gì . Nếu nó là một chức năng, emacs đánh giá tất cả các hình thức lisp arg1
, arg2
vv sau đó gọi hàm myfunc
với kết quả là các đối tượng nói ngọng như các đối số.
Như đã lưu ý, and
không phải là một hàm, nó là một dạng đặc biệt, do đó nó có thể đánh giá các đối số của nó khi cần thiết. Như tôi đã đưa ra trong một nhận xét trước đó, hình thức (and nil (drop 'bomb))
này là an toàn vì (drop 'bomb)
không bao giờ được đánh giá.
Mặt khác, (apply #'and (list nil (drop 'bomb)))
không an toàn, vì apply
là một hàm, do đó, trước tiên emacs đánh giá #'and
(kết quả là một ký hiệu), sau đó đánh giá (list nil (drop 'bomb))
, lại là một lệnh gọi hàm, vì vậy bạn đoán điều gì xảy ra tiếp theo: nil
được đánh giá, sau đó (drop 'bomb)
được đánh giá.
Tại sao lại apply
phàn nàn?
Cố gắng sử dụng apply
trên một hình thức đặc biệt (hoặc một macro) không có ý nghĩa gì, bởi vì hình thức đặc biệt không thể có hành vi đặc biệt của nó, vì vậy nó gây ra lỗi.
and
là một hình thức đặc biệt chứ không phải là một chức năng.