ทำไม elisp ไม่มี namespaces?


40

ถาม:ทำไมเอลลิสจึงไม่มีเนมสเปซและเราจะหามาได้อย่างไร

Elisp ไม่มีเนมสเปซอื่นนอกจากโกลบอลซึ่งนำไปสู่การเขียนโค้ดของการเติมคำนำหน้าฟังก์ชันโกลบอลตัวแปรและค่าคงที่ทั้งหมดด้วยคำนำหน้าที่ไม่ซ้ำใคร

นอกเหนือจากปัจจัยความน่ารำคาญใจแล้วมันยังทำให้ฉันกลายเป็นประเด็นที่เดือดดาลจาก 1) จำนวนไลบรารีและแพ็คเกจที่ยิ่งใหญ่และ 2) การมีอยู่ของฟังก์ชันและตัวแปรดั้งเดิมที่ไม่เคารพต่อคำนำหน้าหรือ มีนิสัยแปลก ๆ พอสมควรว่าไม่มีตัวเลือกคำนำหน้าดี ๆ ที่พวกเขาสามารถใช้ได้ นอกจากนี้ยังหมายถึงความพยายามเป็นระยะ ๆ ในการหาเหตุผลเข้าข้างตนเองรหัสเก่า (เช่นเดียวกับการเปลี่ยนจากclเป็นcl-lib) เป็นจำนวนงานที่ไม่สำคัญ (แม้ว่าฉันจะดีใจในการทำความสะอาด แต่ฉันก็ยังขาดน้ำตาทุกครั้งที่พิมพ์อะไรเช่นนี้cl-find)

ฉันออกไปเดินเล่นรอบ ๆ เพื่อดูว่าฉันจะรู้ได้ไหมว่าทำไมเอลลิสยังคงไม่มีเนมสเปซหลังจากใช้งานไปหลายสิบปี แต่รู้สึกประหลาดใจเล็กน้อยที่การเก็บเกี่ยวเล็กน้อย หน้าวิกิพีเดียใน namespacesค่อนข้างสั้น Nic Ferrierมีการแก้ไขปัญหาอีกต่อไปเล็กน้อยและมีหัวข้อล่าสุดเกี่ยวกับemacs-develเกี่ยวกับเรื่องนี้เช่นกัน มีเธรดสแต็คโอเวอร์โฟลว์เก่าจากปี 2010 ที่กล่าวถึงความเป็นไปได้ในการใช้มาโครในการติดตั้งเนมสเปซ ตัวอย่างของวิธีการแมโครอื่นสามารถพบได้ที่นี่ มีการใช้งานอย่างน้อยสอง ( ที่นี่และที่นี่พร้อมคำอธิบายของหลังที่นี่) ออกไปที่นั่น แต่พวกเขาไม่ได้เห็นกิจกรรมมากนักเป็นเวลาสองปีและฉันไม่ได้ทำงานในห้องสมุดใด ๆ ที่ใช้พวกเขา

ฉันคิดว่าถ้าการเพิ่มเนมสเปซเป็นเรื่องง่าย ดังนั้น:

  • อะไรคืออุปสรรคทางเทคนิคในการเพิ่มเนมสเปซลงใน elisp
  • การเพิ่มเนมสเปซทำลายรหัสที่มีอยู่จำนวนมากหรือไม่
  • ฟังก์ชั่นนี้เป็นบางสิ่งที่จำเป็นต้องเป็นออร์แกนิกเป็นเอลิค (เปลี่ยนล่ามเอง) หรือมันสามารถสร้างขึ้นมาจากด้านบนผ่านมาโครได้หรือไม่?

6
คุณสามารถดูได้ที่นี้: github.com/Bruce-Connor/namesดูเหมือนว่าจะใช้งานย้อนหลังได้ (ด้วยวิธีการแยกชื่อปัจจุบันด้วยตนเอง) ของการใช้เนมสเปซอัตโนมัติ (และฉัน 99% แน่ใจว่าฉันได้เห็นไลบรารี่ดังกล่าวช่วยให้นักพัฒนาสามารถส่งออกชุดย่อยของฟังก์ชั่นที่มีเนมสเปซได้กล่าวถึงเมื่อไม่นานมานี้ในบล็อกของ emacs แต่ฉันหากลับไม่ได้)
T. Verron

2
ฉันสองคุณควรดูลิงค์ด้านบน มันเป็นแมโครเนมสเปซที่แข็งแกร่งมาก (เผยแพร่เมื่อเดือนที่แล้ว) ฉันยังคงหาข้อผิดพลาดเล็กน้อยในแง่ของความเข้ากันได้กับเครื่องมือเช่น edebug แต่แพ็คเกจใช้งานได้ การตอบคำถามของคุณเป็นบทความที่ยาวมาก (ปัญหาและอุปสรรคทางเทคนิคที่ฉันพบเจอมีมากมาย) แต่ฉันจะพยายามนำไปโพสต์ในบล็อกในสัปดาห์หน้า
Malabarba

1
ฉันเดาว่าเนมสเปซมีความหมายต่างกัน ฉันจะบอกว่า emacs มี namespaces หลาย: หนึ่งสำหรับตัวแปรอื่นสำหรับฟังก์ชั่นและมาโครสำหรับใบหน้าและสำหรับธีมและ ...
Harald Hanche-Olsen

1
@ HaraldHanche-Olsen คุณสามารถพูดได้อย่างแน่นอน ในบริบทนั้นเขาถามว่าทำไมไม่มีเนมสเปซต่อแพ็คเกจ
Malabarba

คำตอบ:


28

ทำไมไม่มีเนมสเปซ

เพราะมันซับซ้อนและยังไม่มีใครคิดว่ามันด่วนพอที่จะกระโดดได้เต็ม เรื่องนี้ได้รับการกล่าวถึงในรายการ dev ก่อนหน้านี้ (มากกว่าหนึ่งครั้ง) และมีสัญญาว่าจะแก้ไขปัญหานี้หลังจากย้ายไปคอมไพล์

ในระหว่างนี้ฉันได้เขียนวิธีแก้ปัญหาของตัวเอง (ดูรายการตัวเลือกด้านล่าง)

อะไรคืออุปสรรคทางเทคนิค?

เพียงออกจากประตูคุณมีอุปสรรคขนาดใหญ่ 3 ประการซึ่งคุณต้องผ่านเพื่อให้ namespaces มีโอกาสทำงานกับ Emacs ปัจจุบัน:

  • คุณต้องเปลี่ยนวิธีการใส่สัญลักษณ์ (ซึ่งเป็นส่วนที่ง่าย)
  • ไบต์คอมไพเลอร์จำเป็นต้องเข้าใจ namespaces
  • รุ่น autoload ที่ใช้โดยpackage.elจำเป็นต้องเข้าใจ namespaces

การปรับปรุง 3 สิ่งเหล่านี้เพื่อให้ทำงานร่วมกับคุณได้อย่างไรก็ตามเมื่อคุณติดตั้งเนมสเปซ หากคุณทุ่มเทเฉพาะกับเวอร์ชั่นล่าสุดของ Emacs ก็เป็นไปได้อย่างแน่นอน หากคุณต้องการเขียนแพคเกจบางประเภทที่รองรับเวอร์ชั่นก่อนหน้า (เช่นทั้ง 24 ตระกูล) มันจะกลายเป็นความท้าทายอย่างหนึ่ง

นอกจากนั้นยังมีสิ่งกีดขวางทางเลือกอื่นอีกมากมาย Elisp นั้นยอดเยี่ยมเพราะพลังทั้งหมดในเครื่องมือที่มีให้คุณและทั้งหมด นี้จะต้องได้รับการติดตั้งเพื่อทำงานกับเนมสเปซ ที่สำคัญที่สุดคือ:

  • edebug
  • EVAL-defun
  • EVAL-สุดท้าย sexp
  • น้ำเมือก

มันจะทำลายรหัสที่มีอยู่จำนวนมากหรือไม่

ไม่ถ้าคุณทำมันถูกต้อง

นี่เป็นสิ่งที่ต้องมีความเป็นออร์แกนิกหรือว่ามันจะถูกสร้างขึ้นจากบนสุดผ่านมาโครหรือไม่?

เป็นการดีที่มันจะเป็นอินทรีย์นั่นคือสิ่งที่มักจะกล่าวถึงเมื่อมันมาในรายการ dev แต่มันสามารถทำดีพอในขณะที่ถูกสร้างขึ้นด้านบน
นี่คือตัวอย่างเล็ก ๆ น้อย ๆ ที่นำมาจากรายการนี้ :


1
ขอบคุณ - นั่นเป็นข้อมูลที่ได้รับอย่างมากในเรื่องนี้ ฉันอยากรู้เกี่ยวกับประเด็นสุดท้ายของคุณอีกครั้ง: namesวิธีการแก้ปัญหาของคุณ ฉันสงสัยว่ามีเหตุผลใดที่สงสัยว่าสารละลายอินทรีย์ที่มีอยู่ในตัวนั้นกำลังจะมาในอนาคตไม่ไกลเกินไปหรือไม่หรือว่าเราควรจะใช้สารละลายที่มีอยู่ในตัวที่คุณให้มา
แดน

1
@ แดนใช่มี . ที่กล่าวว่าไม่มีเหตุผลที่จะไม่ใช้ชื่อในระหว่างนี้ มันเข้ากันได้อย่างสมบูรณ์กับแบบแผนของ Emacs ดังนั้นแพ็คเกจใด ๆ ที่ใช้ชื่อมีอิสระที่จะหยุดใช้ชื่อได้ตลอดเวลาและผู้ใช้จะไม่ทราบอะไรเลย
Malabarba

คุณควรเพิ่มลงnamelessในรายการนี้จริงๆ:) มันเป็นความคิดที่ยอดเยี่ยมและมันแก้ปัญหาได้อย่างเรียบร้อยมาก
Clément

22

ครั้งล่าสุดที่มีการพูดคุยกันเกี่ยวกับ emacs-devel การอภิปรายหยุดลงเมื่อคนอย่าง Lars ชี้ให้เห็นว่าพวกเขาชอบM-x grepทำอะไรบางอย่าง การเพิ่มเนมสเปซลงใน Elisp ไม่ควรยากเกินไป แต่การได้รับเครื่องมือที่คุ้นเคยทั้งหมดเพื่อจัดการกับพวกเขาถูกต้องเป็นอีกปัญหาหนึ่ง


ผมคิดว่าอาจจะง่าย 'ถาวร' โดยการสร้างนามแฝงสำหรับฟังก์ชั่นที่ใช้กันมากที่สุด (หรือทั้งหมดของพวกเขาอาจจะ)
เจสซี่

1
ความจำเป็นในการ "grep" จะปรากฏขึ้นโดยปกติในขณะที่พัฒนาแพ็กเกจซึ่งคุณต้องทราบว่าอาจใช้ตัวแปร / ฟังก์ชั่นใดในแพ็คเกจอื่นดังนั้นจึงสามารถนำไปใช้กับตัวแปร / ฟังก์ชั่นโดยพลการใด ๆ ด้วยเหตุผลนี้การเพิ่มนามแฝงเล็กน้อยจะไม่ทำให้เกิดความแตกต่าง อีกสาเหตุที่ mit ไม่ช่วยก็คือการเพิ่มชื่อแทนจะไม่ช่วยให้คุณค้นหาการใช้ที่ไม่ได้ใช้ชื่อแทนนี้
Stefan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.