Làm thế nào để defalias lambda?


8

Tôi có cái này trong .emacs của tôi:

(defalias 'λ 'lambda)

mà hoạt động tốt cho những điều đơn giản như (funcall (λ (x) x) 1).

Nhưng khi tôi làm một cái gì đó như (org-add-link-type "foo" (λ (s) (message s)))hoặc (add-to-list 'auto-mode-alist '("foo" . (λ () (message "bar")))), nó không hoạt động và tôi nhận được

org-open-at-point: Hàm không hợp lệ: ((s) (tin nhắn s))

Lỗi đặc tả chế độ tệp: (hàm không hợp lệ (λ nil (thông báo "bar")))

tương ứng.

Có ai biết những gì sai ở đây?


4
Không phải là một câu trả lời cho câu hỏi về defalias, nhưng bạn có thể muốn kiểm tra prettify-symbols-mode, trong số những thứ khác, sẽ cho phép bạn hiển thị lambdanhư λkhông thực sự thay đổi văn bản cơ bản.
Dân

Một thư viện đơn giản chỉ dành riêng cho lambda (đến λ) : pretty-lambdada.el.
vẽ

Nếu bạn chỉ muốn những biểu tượng đẹp thì hãy sử dụng github.com/akatov/pretty-mode
grettke

Câu trả lời:


11

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))))

Cảm ơn đã giải thích cặn kẽ! Bây giờ mọi thứ đều hoạt động tốt :)
rtrn

3

Có vẻ như vấn đề không nằm ở chỗ defalias, mà là bạn đang gọi ở đâu và như thế nào λ. funcall, như các đối số của nó, một hàm và các đối số của hàm đó, vì vậy funcallví dụ của bạn hoạt động tốt.

Cả org-add-link-typeauto-mode-alist, tuy nhiên, mong đợi các biểu tượng có chứa các chức năng có liên quan. Do đó, xây dựng các ví dụ của bạn, những điều sau đây sẽ hoạt động:

(defun a-silly-fnx (s)
  (message s))
(defalias #'my-link-alias #'a-silly-fnx)
(org-add-link-type "foo" #'my-link-alias)

(defun a-tester-fnx ()
  (message "Testing!")
  (sit-for 2))
(defalias #'my-alist-alias #'a-tester-fnx)
(add-to-list 'auto-mode-alist '("foo" . my-alist-alias))

Nếu bạn hầu như đang tìm cách λhiển thị trong bộ đệm của mình, hãy xem xét dùng thử prettify-symbols-mode, nó sẽ hiển thị lambdanhư λkhông thay đổi văn bản của bộ đệm.


Điều kỳ lạ là mọi thứ đều hoạt động tốt khi tôi sử dụng lambdatrực tiếp.
rtrn

@rtrn: à, điểm tốt. Tôi đoán đó là vì lambdamacro trả về một lambdahình thức đặc biệt tự trích dẫn mà bí danh không nhận được, nhưng có thể có nhiều ma thuật đen hơn ở đây. Triệu tập @Malabarba.
Dan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.