Tek bir argüman ve virgülle alıntı yapmanın anlamı nedir? (alıntı, arg)


15

(quote x)markaları değerlendirmeye alınmayacaktır x, ancak bir ekleme ,önünde xdahilinde quoteyapar o değerlendirdi. Öyleyse, önünde virgül bulunan tek bir argümanla alıntı kullanmanın anlamı nedir (quote ,x)?

Can sıkıcı oklardan satır 59 ile motive :

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

Neden (put cmd 'aa-alts ,alternatives)eşit derecede iyi değil ?

Yanıtlar:


20

Virgül bağlamında kullanılan backquoted seçici liste bazı bölümlerini değerlendirmesine olanak tanır (aka quasiquoted) listesi. Geri alıntı için bir kullanım örneği için bu konuya da bakın .

Birkaç basit örnek:

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

Bahsettiğiniz virgüller , bir makro tanımındadır ve sırayla bir arka alıntı kullanır 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))))))

,cmdbackquote içinde cmdsembol yerine yerine değerini koymak için izin verir cmd.


1
Ackey, öyleyse önündeki alıntı, progndeğerlendirilmek istediğiniz şeylerin önüne virgül koymanız gerektiği anlamına geliyor, ne kadar iç içe olursa olsun? ( ,cmdBaşka bir liste içerisindedir, doğrudan içeride değildir (progn).)
The Unfun Cat

Bu test etmek için iyi bir fırsat gibi görünüyor! Değerlendirmeyi (setq a "a's value" b "b's value" c "c's value")ve sonra değerlendirmeyi deneyin `(a '(,b c)).
Dan

Diğer yeni ürünler: değerlendirmek için metni çizik arabelleğinize ekleyin, ardından imlecinizi satırın sonuna getirin, ardından Cxe tuşuna basın.
Unfun Cat

11

Çünkü bir makronun içinde. Bir makronun Lisp formunu döndürmesi gerekir; bu form daha sonra değerlendirilir.

Örneğin, bu makronun ilk çağrılmasına bakıldığında:

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

Aşağıdakileri içerecek şekilde genişletmeye ihtiyacımız var:

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

hangi şeydir (quote ,cmd)başarır. Makro cmdbunun yerine düz kullanırsa, tam anlamıyla korunur ve genişleme şöyle olur:

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

Bu bir hatadır, çünkü cmdmakronun çağrıldığı ortamda tanımlanmamıştır.


Bu da harika bir açıklama. Hecelediğiniz için teşekkürler.
Unfun Cat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.