Với sự giúp đỡ của lunaryorn trên reddit , tôi đoán tôi đã có thể hiểu lý do tại sao bạn quan sát hành vi "wierd".
Vấn đề là bạn đang trích dẫn biểu thức
'("foo" . (λ () (message "bar")))
Mà tương đương với hình thức
(cons "foo" '(λ () (message "bar")))
Bây giờ khi emacs mở một tệp có phần mở rộng "foo", nó sẽ thực hiện một số thứ như sau
(funcall '(λ () (message "bar")))
Lưu ý thêm trích dẫn, trước đây (λ
, đây rõ ràng không phải là chức năng hợp lệ và bạn gặp lỗi Invalid function: ...
Nhưng sau đó tại sao nó ("foo" . (lambda () (message "bar")))
hoạt động, điều này được giải thích bằng quan sát của lunaryorn
Danh sách lambda của người Viking, tức là một danh sách có xe là lambda, cũng là một chức năng hợp lệ
Vì vậy, '(lambda () (message "bar"))
là một chức năng hợp lệ, điều này có thể được xác minh bằng mã sau đây
(functionp (lambda () "hello")) => t
(functionp (λ () "hello")) => t
(functionp '(lambda () "hello")) => t
(functionp '(λ () "hello")) => nil
Vì vậy, giải pháp sẽ chỉ đơn giản là không trích dẫn biểu thức sử dụng như sau
(add-to-list 'auto-mode-alist (cons "foo" (λ () (bar))))
defalias
, nhưng bạn có thể muốn kiểm traprettify-symbols-mode
, trong số những thứ khác, sẽ cho phép bạn hiển thịlambda
nhưλ
không thực sự thay đổi văn bản cơ bản.