จุดอ้างอิงที่มีอาร์กิวเมนต์เดี่ยวและเครื่องหมายจุลภาคคืออะไร (อ้างถึงหาเรื่อง)


15

(quote x)ทำให้ x ไม่ได้รับการประเมิน แต่เพิ่ม,ในด้านหน้าของxภายในquoteทำให้การประเมิน คืออะไรแล้วจุดของการใช้คำพูดที่มีอาร์กิวเมนต์เดียวด้วยเครื่องหมายจุลภาคในด้านหน้าของมันเช่นดังนั้น: (quote ,x)?

แรงบันดาลใจจากสาย 59 จากลูกศรที่น่ารำคาญ :

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

ทำไมจึงไม่(put cmd 'aa-alts ,alternatives)ดีเท่ากัน?

คำตอบ:


20

เครื่องหมายจุลภาคถูกใช้ในบริบทของรายการbackquote (aka quasiquoted) ซึ่งช่วยให้คุณสามารถประเมินบางส่วนของรายการที่เลือก ดูเพิ่มเติมที่เธรดนี้สำหรับตัวอย่างของการใช้สำหรับ backquoting

ตัวอย่างง่ายๆสองตัวอย่าง:

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

เครื่องหมายจุลภาคที่คุณอ้างถึงอยู่ในนิยามแมโครซึ่งในทางกลับกันก็ใช้ 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))))))

,cmdภายใน backquote ช่วยให้คุณสามารถใส่ค่าของในสถานที่มากกว่าสัญลักษณ์cmdcmd


1
ตอบดังนั้นการเสนอราคาต่อหน้าprognหมายความว่าคุณต้องใส่เครื่องหมายจุลภาคต่อหน้าสิ่งที่คุณต้องการประเมินไม่ว่ามันจะซ้อนอยู่ไกลแค่ไหน? ( ,cmdอยู่ในรายการอื่นไม่ใช่ภายในโดยตรง(progn))
The Unfun Cat

นี่เป็นโอกาสที่ดีที่จะทดสอบ! ลองประเมินแล้วการประเมิน(setq a "a's value" b "b's value" c "c's value") `(a '(,b c))
แดน

newbs อื่น ๆ : เพื่อประเมินเพิ่มข้อความลงในบัฟเฟอร์ของคุณจากนั้นวางเคอร์เซอร์ที่ท้ายบรรทัดแล้วกด Cxe
Cat Unfun

11

นั่นเป็นเพราะมันอยู่ในมาโคร แมโครต้องส่งคืนฟอร์ม Lisp ซึ่งจะได้รับการประเมินในทางกลับกัน

ตัวอย่างเช่นการดูการร้องขอแรกของแมโครนี้:

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

เราต้องการการขยายเพื่อประกอบด้วย:

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

ซึ่งเป็นสิ่งที่(quote ,cmd)บรรลุ ถ้าแมโครจะใช้ธรรมดาcmdแทนมันจะถูกเก็บไว้อย่างแท้จริงและการขยายตัวจะเป็น:

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

ซึ่งเป็นข้อผิดพลาดเนื่องจากcmdไม่ได้กำหนดไว้ในสภาพแวดล้อมที่เรียกใช้แมโคร


นี่เป็นคำอธิบายที่ดีเช่นกัน ขอบคุณที่สะกดมันออกมา
Cat Unfun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.