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 đó myfunclà 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, arg2vv sau đó gọi hàm myfuncvới kết quả là các đối tượng nói ngọng như các đối số.
Như đã lưu ý, andkhô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 applyphàn nàn?
Cố gắng sử dụng applytrê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.
andlà một hình thức đặc biệt chứ không phải là một chức năng.