ฉันจะยกเลิกคำจำกัดความสัญลักษณ์ทั้งหมดด้วยคำนำหน้าบางอย่างได้อย่างไร


11

ฉันกำลังเปลี่ยน API ของแพคเกจของฉันค่อนข้างบ่อย แต่company-modeดึงทุกสัญลักษณ์ที่กำหนดไว้ (เท่าที่ควร) ในการทำให้สมบูรณ์ ฉันไม่ต้องการใช้ชื่อไม่ได้ผูกไว้โดยไม่ตั้งใจดังนั้นฉันจะยกเลิกการผูกตัวแปรและฟังก์ชั่นทั้งหมดที่ขึ้นต้นด้วยพูดว่าmy-package-อย่างไร หลังจากนี้ฉันจะกลับไปload-fileอีกครั้งได้

คำตอบ:


10

เรียกunload-featureเพื่อยกเลิกการกำหนดสัญลักษณ์ทั้งหมดที่กำหนดไว้เป็นส่วนหนึ่งของการโหลดแหล่ง Elisp หรือไฟล์ที่คอมไพล์ด้วยไบต์ ตรวจสอบให้แน่ใจว่าไฟล์ของคุณสิ้นสุดโดยการเรียกprovideที่ท้าย นี่ถือว่าคุณโหลดไฟล์ด้วยหนึ่งในloadฟังก์ชั่นหรือผ่านrequireมันจะไม่ได้กำหนดสัญลักษณ์ที่กำหนดโดยC-M-x( eval-defun) หรือกลไกที่คล้ายกัน

หากคุณต้องการยกเลิกการผูกสัญลักษณ์ตามชื่อของพวกเขาแทนที่จะยึดตามแพ็คเกจที่กำหนดไว้คุณสามารถใช้mapatomsเพื่อวนซ้ำสัญลักษณ์ทั้งหมดได้

(mapatoms (lambda (symbol)
            (if (string-prefix-p "foo-" (symbol-name symbol))
                (unintern symbol))))

มีประโยชน์ แต่ฉันไม่เชื่อว่าสิ่งนี้จะมีประสิทธิภาพกับการพัฒนาเชิงโต้ตอบตามที่ฉันอธิบาย ฉันลึกกว่าfeatureระบบหนึ่งระดับ ฉันทำงานกับฟังก์ชั่นและตัวแปรเท่านั้นโดยไม่มีการจัดกลุ่มอย่างชัดเจน (provide 'my-package)ฉันไม่ได้ใส่ใจการประเมิน
ฌอน Allred

2
@SeanAllred provideฉันไม่สามารถคิดว่าเป็นเหตุผลที่ดีที่จะไม่ใช้ แต่อย่างไรก็ตามถ้าคุณต้องการทำสิ่งที่สกปรกจริงๆดูการแก้ไขของฉัน
Gilles 'หยุดชั่วร้าย'

โอ้ฉันรักprovideฉันแค่ไม่คิดว่ามันจะใช้ได้ในกรณีนี้ ฟังก์ชั่นจำได้ว่าไฟล์อะไรที่พวกมันถูกนิยามไว้ถ้ามันถูกประเมินแบบโต้ตอบ
Sean Allred

2
unload-featureไม่มีผลหากคุณประเมินโค้ดโดยไม่โหลดจากไฟล์ (ที่มีprovide)
ดึง

2
@SeanAllred ไม่ฟังก์ชั่นจะจำได้เฉพาะตำแหน่งที่โหลดจากไฟล์หากโหลดเป็นส่วนหนึ่งของการโหลดไฟล์
Gilles 'หยุดชั่วร้าย'

7
  • ใช้makunboundเพื่อลบการใช้สัญลักษณ์เป็นตัวแปรแบบไดนามิก (เช่นเพื่อโมฆะsymbol-value)

  • ใช้fmakunboundเพื่อลบการใช้สัญลักษณ์เป็นฟังก์ชัน (เช่นเพื่อทำให้เป็นโมฆะsymbol-function)

  • ใช้mapatomsเพื่อวนซ้ำสัญลักษณ์ทั้งหมด ทำหน้าที่ในแต่ละซึ่งsymbol-nameจะถูกจับคู่โดยคำนำหน้าโดยเฉพาะอย่างยิ่งคุณมีความสนใจใน: ทั้งโทรmakunboundและfmakunboundอยู่กับมัน

  • คุณไม่จำเป็นต้องuninternใช้สัญลักษณ์ยกเว้นว่าคุณกำลังใช้ความสมบูรณ์ของสัญลักษณ์เองและไม่ใช่เพียงแค่การใช้เป็นตัวแปรหรือฟังก์ชั่นเท่านั้น แต่ถ้าคุณไม่uninternต้องการที่จะสมบูรณ์ลบสัญลักษณ์แล้วการใช้งาน

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