T: Mengapa elisp tidak memiliki ruang nama, dan bagaimana kami bisa mendapatkannya?
Elisp tidak memiliki ruang nama selain yang global, yang telah menyebabkan konvensi pengkodean prefixing semua fungsi global, variabel, dan konstanta dengan awalan yang unik.
Selain dari faktor gangguan, ia juga menganggap saya sebagai masalah mendidih yang diberikan 1) jumlah perpustakaan dan paket besar yang terus bertambah, dan 2) keberadaan fungsi dan variabel lama yang tidak menghargai konvensi awalan, atau cukup istimewa bahwa sebenarnya tidak ada opsi awalan yang baik yang bisa mereka gunakan. Ini juga berarti bahwa upaya berkala untuk merasionalisasi kode lama (seperti transisi dari cl
ke cl-lib
) adalah jumlah pekerjaan yang tidak sepele. (Meskipun saya senang untuk pembersihan, saya masih meneteskan air mata setiap kali saya mengetik sesuatu seperti cl-find
).
Saya mencari-cari untuk mencari tahu mengapa elisp masih tidak memiliki ruang nama setelah beberapa dekade digunakan, tetapi sedikit terkejut dengan panen yang sederhana. The halaman wiki di ruang nama yang cukup singkat. Nic Ferrier memiliki perawatan yang sedikit lebih lama dari masalah ini, dan ada utas yang cukup baru tentang emacs-devel juga. Ada thread Stack Overflow lama dari 2010 yang membahas kemungkinan menggunakan makro untuk mengimplementasikan ruang nama; contoh lain dari pendekatan makro dapat ditemukan di sini . Setidaknya ada beberapa implementasi (di sini dan di sini , dengan deskripsi yang terakhir di sini) di luar sana, tetapi mereka belum melihat banyak kegiatan selama beberapa tahun, dan saya belum menemukan perpustakaan yang menggunakannya.
Saya berasumsi bahwa, jika menambahkan ruang nama itu mudah, itu sudah akan dilakukan. Begitu:
- Apa kendala teknis untuk menambahkan ruang nama ke elisp?
- Apakah menambahkan ruang nama akan merusak banyak kode yang ada?
- Apakah fungsi ini sesuatu yang harus organik ke elisp (perubahan pada juru bahasa itu sendiri), atau bisakah itu benar-benar dibangun di atas melalui makro?
Jawaban:
Mengapa tidak ada Namespaces?
Karena rumit, dan belum ada yang menganggapnya cukup mendesak untuk mengambil risiko penuh. Ini telah dibahas dalam daftar dev sebelumnya (lebih dari satu), dan ada janji untuk memperbaikinya setelah pindah ke git.
Sementara itu, saya menulis solusi sendiri (lihat di bawah untuk daftar opsi).
Apa saja kendala teknisnya?
Di luar pintu Anda memiliki 3 rintangan besar, yang harus Anda lewati sehingga ruang nama bahkan memiliki peluang untuk bekerja pada Emacs saat ini:
package.el
kebutuhan untuk memahami ruang nama.Menambal 3 hal ini untuk bekerja dengan tetapi Anda datang untuk mengimplementasikan ruang nama tidaklah sepele. Jika Anda hanya berdedikasi untuk versi Emacs terbaru itu tentu bisa dilakukan. Jika Anda ingin menulis semacam paket yang juga mendukung versi sebelumnya (seperti seluruh 24 keluarga), itu berubah menjadi tantangan besar.
Di luar itu, ada banyak hambatan opsional lainnya. Elisp bagus karena semua kekuatan dalam alat yang tersedia untuk Anda dan SEMUA dari ini perlu ditambal untuk bekerja dengan ruang nama. Di antara yang paling penting adalah:
Apakah akan merusak banyak kode yang ada?
Tidak jika Anda melakukannya dengan benar.
Apakah ini sesuatu yang harus organik, atau bisakah itu benar-benar dibangun di atas melalui makro?
Idealnya itu organik, itulah yang biasanya dibahas ketika muncul di daftar dev. Tapi itu bisa dibuat cukup baik saat sedang dibangun di atas.
Berikut adalah beberapa contohnya, diambil dari daftar ini :
sumber
names
solusi Anda . Saya ingin tahu apakah ada alasan untuk curiga bahwa solusi organik bawaan akan datang dalam waktu yang tidak terlalu lama, atau jika kita harus mengadopsi solusi bawaan yang Anda berikan.nameless
ke daftar ini :) Ini adalah ide yang cemerlang, dan itu memecahkan masalah dengan sangat rapi.Terakhir kali ini dibahas pada emacs-devel, diskusi berhenti ketika orang-orang seperti Lars menunjukkan bahwa mereka suka bisa melakukan
M-x grep
sesuatu. Menambahkan ruang nama ke Elisp seharusnya tidak terlalu sulit, tetapi mendapatkan semua alat yang sudah dikenal untuk menanganinya dengan benar adalah masalah lain.sumber