Điểm của trích dẫn với đối số duy nhất và dấu phẩy là gì? (trích dẫn, lập luận)


15

(quote x)làm cho x không được đánh giá, nhưng thêm một ,ở phía trước xbên trong quotelàm cho nó được đánh giá. Sau đó, điểm của việc sử dụng trích dẫn với một đối số duy nhất với dấu phẩy ở phía trước của nó là gì: như vậy : (quote ,x)?

Được thúc đẩy bởi dòng 59 từ các mũi tên khó chịu :

(put (quote ,cmd) 'aa--alts ,alternatives)

Tại sao không (put cmd 'aa-alts ,alternatives)tốt như nhau?

Câu trả lời:


20

Dấu phẩy được sử dụng trong bối cảnh của một backquoted danh sách (aka quasiquoted), cho phép bạn để đánh giá một số phần của danh sách chọn lọc. Xem thêm chủ đề này để biết ví dụ về việc sử dụng để backquote.

Một vài ví dụ đơn giản:

(setq a "a's value" b "b's value" c "c's value")
'(a  b  c)                              ; => (a b c)
`(,a b ,c)                              ; => ("a's value" b "c's value")

Dấu phẩy mà bạn đang đề cập là trong một định nghĩa vĩ mô, đến lượt nó, sử dụng một backquote progn:

(defmacro add-annoying-arrows-advice (cmd alternatives)
  `(progn
     (add-to-list 'annoying-commands (quote ,cmd))
     (put (quote ,cmd) 'aa--alts ,alternatives)
     (defadvice ,cmd (before annoying-arrows activate)
       (when annoying-arrows-mode
         (aa--maybe-complain (quote ,cmd))))))

,cmdtrong backquote cho phép bạn đặt giá trị cmdtại chỗ thay vì biểu tượng cmd.


1
Ackey, vì vậy, trích dẫn ở phía trước progncó nghĩa là bạn phải đặt dấu phẩy trước nội dung bạn muốn đánh giá, cho dù nó được lồng bao xa? (Cái ,cmdnằm trong một danh sách khác, không trực tiếp trong (progn).)
The Unun Cat

Đây dường như là một cơ hội tốt để thử nghiệm nó! Hãy thử đánh giá (setq a "a's value" b "b's value" c "c's value")và sau đó đánh giá `(a '(,b c)).
Dân

Các newbs khác: để đánh giá thêm văn bản vào bộ đệm đầu của bạn, sau đó đặt con trỏ ở cuối dòng, sau đó nhấn Cxe.
Mèo Unun

10

Đó là bởi vì nó nằm trong một vĩ mô. Một macro cần trả về một hình thức Lisp, sau đó lần lượt được đánh giá.

Ví dụ: nhìn vào lời gọi đầu tiên của macro này:

(add-annoying-arrows-advice previous-line '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))

Chúng tôi cần mở rộng để chứa:

(put 'previous-line 'aa-alts '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))

đó là những gì (quote ,cmd)đạt được. Nếu macro sẽ sử dụng đơn giản cmdthay vào đó, nó sẽ được giữ nguyên theo nghĩa đen và việc mở rộng sẽ là:

(put cmd 'aa-alts '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))

đó là một lỗi, bởi vì cmdkhông được xác định trong môi trường mà macro được gọi.


Đây cũng là một lời giải thích tuyệt vời. Cảm ơn đã đánh vần nó ra.
Mèo Unun
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.