คำถามติดแท็ก elisp-macros

2
“ และ” vs“ เมื่อ” สำหรับเงื่อนไข
นี่คือการติดตามความคิดเห็นของคำตอบนี้ บิตของรหัสต่อไปนี้ดูเหมือนจะเทียบเท่า: (and a b) (when a b) แน่นอนandช่วยให้คุณใส่เงื่อนไขเพิ่มเติม: (and a b c d)หมายถึง(when (and a b c) d) ฉันมักจะใช้whenเพื่อแสดงการแตกแขนงเท่านั้น มีความแตกต่างที่เกิดขึ้นจริง? ดีกว่าที่จะใช้อย่างใดอย่างหนึ่ง? ฉันไม่มีแหล่งที่มาของ Emacs andเป็นฟังก์ชั่น C; whenเป็นแมโครที่ขยายไปifซึ่งตัวมันเองเป็นฟังก์ชั่น C

2
แมโครถูกขยายเมื่อรวบรวมไฟล์หรือไม่?
ฉันมีมาโครที่ต้องขยายในทุก ๆ อินสแตนซ์ของการใช้งานคอมไพล์เวลา มีวิธีที่ฉันสามารถระบุให้เป็นเช่นนั้นโดยไม่ต้องผ่าน codebase และตัดสายแต่ละอย่างด้วยeval-when-compileหรือไม่

1
มาโครที่มี defcustom ทำให้เกิดข้อผิดพลาด“ ค่าของสัญลักษณ์ในฐานะตัวแปรถือเป็นโมฆะ” เมื่อรวบรวมไบต์
ในสองแพคเกจของฉันฉันมีแมโครที่ร่างกายขึ้นอยู่กับตัวแปรที่กำหนดในdefcustomรูปแบบ เมื่อติดตั้งแพ็คเกจจาก Melpa การรวบรวมไบต์จะสิ้นสุดด้วย: ข้อผิดพลาด: ค่าของสัญลักษณ์ในฐานะตัวแปรถือเป็นโมฆะ: my-defcustom-variable จากนั้นคอมไพล์ไฟล์ด้วยตนเองโดยการเปิดไฟล์ในบัฟเฟอร์ทำงาน ฉันลองใช้autoloadคุกกี้ แต่ยังคงมีพฤติกรรมเหมือนเดิม ฉันพลาดสิ่งสำคัญที่นี่

3
เมื่อใดที่จะใช้มาโครหรือไม่ใช้ [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว เมื่อใดที่ฉันควรใช้มาโครในโปรแกรมหรือไม่ คำถามนี้ได้รับแรงบันดาลใจจากคำตอบที่ให้ข้อมูลโดย @tarsius ฉันเชื่อว่าหลายคนมีประสบการณ์ที่ยอดเยี่ยมในการแบ่งปันผู้อื่น ฉันหวังว่าคำถามนี้กลายเป็นหนึ่งในคำถามอัตนัยที่ดีและช่วยโปรแกรมเมอร์ของ Emacs

2
จะใช้ while-no-input ได้อย่างไร?
จาก docstring: ดำเนินการ BODY ตราบใดที่ไม่มีการป้อนข้อมูลที่รอดำเนินการ หากอินพุตมาถึงนั่นจะเป็นการจบการทำงานของ BODY และwhile-no-inputส่งคืน t การเลิกทำให้มันกลับมาเป็นศูนย์ ถ้า BODY เสร็จแล้วwhile-no-inputส่งคืนค่าใด ๆ ที่ BODY สร้างขึ้น หากฉันเข้าใจอย่างถูกต้องมาโครนี้จะอนุญาตให้ฉัน (พยายาม) ทำการคำนวณอย่างหนักโดยไม่ต้องแขวนอินเทอร์เฟซ นั่นเป็นแนวคิดที่ฉันคิดว่าน่าสนใจ แต่ฉันก็ยังสงสัยว่าเมื่อไรที่มีประโยชน์ในทางปฏิบัติ ดูเหมือนว่าการคำนวณสามารถถูกขัดจังหวะได้ตลอดเวลาโดยไม่มีข้อมูลว่าเกิดอะไรขึ้นและไม่มีวิธีที่ง่ายในการดำเนินการต่อในภายหลัง ซึ่งทำให้ฉันคิดว่ามันอาจจะไม่เป็นประโยชน์หลังจากทั้งหมด ... มีวิธีแนะนำให้ใช้while-no-inputแมโครหรือไม่? มีตัวอย่างการใช้มาโครนี้ในป่าไหม?

3
ฉันจะสร้างหลาย defuns ได้โดยการวนซ้ำผ่านรายการได้อย่างไร
ฉันกำลังทำงานเพื่อปรับแต่งการกำหนดค่า emacs ของฉันซึ่งฉันสามารถสร้างฟังก์ชั่นแบบโต้ตอบสำหรับธีมทั้งหมดที่ฉันมีในรายการ ด้านล่างนี้เป็นเวอร์ชั่นที่เรียบง่ายของสิ่งปลูกสร้างที่ฉันพยายามจะทำงาน ;; List containing names of functions that I want to create (setq my/defun-list '(zz-abc zz-def zz-ghi)) ;; Elisp macro to create an interactive defun whose name ;; is passed as the macro argument (defmacro my/create-defun (defun-name) `(defun ,defun-name () (interactive) (let ((fn-name (symbol-name ',defun-name))) (message "Testing …

1
การกำหนดขอบเขตตัวแปรสำหรับมาโครเป็นอย่างไร
macro.elใช้แมโครตัวอย่างต่อไปนี้ที่กำหนดไว้ใน (defmacro some-macro (&rest body) `(let ((some-variable 1)) ,@body)) และสามารถใช้ฟังก์ชั่นดังต่อไปนี้กำหนดไว้ในแฟ้มที่แตกต่างกันfunction.el , (defun some-function () (some-macro (do-something))) เมื่อfunction.elใดที่คอมไพล์ด้วยไบต์จะsome-variableถูกผูกไว้ภายใต้การรวมคำหรือแบบไดนามิก? ฉันเข้าใจว่าสิ่งนี้ขึ้นอยู่กับว่าไฟล์นั้นใช้-*- lexical-binding: t; -*-หรือไม่ดังนั้นคำถามของฉันเกี่ยวกับสถานการณ์ต่อไปนี้โดยเฉพาะ: หากfunction.elใช้การเชื่อมศัพท์ แต่macro.elไม่ หากmacro.elใช้การเชื่อมศัพท์ แต่function.elไม่ มันสร้างความแตกต่างถ้าsome-varมีการประกาศทั่วโลก (มี defvar) ภายในfunction.el? ถ้าไม่ฉันสนใจโดยเฉพาะในกรณีที่มันไม่ได้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.