Mengapa elisp tidak memiliki ruang nama?

40

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 clke 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?
Dan
sumber
6
Anda dapat melihat ini: github.com/Bruce-Connor/names Tampaknya implementasi yang kompatibel dengan mundur (dengan cara manual memisahkan nama) saat ini menggunakan ruang nama otomatis. (Dan saya 99% yakin saya telah melihat perpustakaan seperti itu, memungkinkan pengembang untuk mengekspor subset fungsi dengan namespaces, baru-baru ini disebutkan di beberapa blog emacs, tetapi saya tidak dapat menemukannya kembali).
T. Verron
2
Saya kedua Anda harus melihat pada tautan di atas. Ini adalah makro namespace yang sangat baru (dirilis bulan lalu) dan sangat kuat. Saya masih bekerja beberapa ketegaran dalam hal kompatibilitas dengan alat-alat seperti edebug, tetapi paket itu berfungsi. Menjawab pertanyaan Anda adalah esai yang sangat panjang (hambatan teknis yang saya hadapi banyak) tetapi saya akan mencoba memasukkannya ke dalam posting blog selama beberapa minggu ke depan.
Malabarba
1
Saya kira ruang nama memiliki arti yang berbeda. Saya akan mengatakan emacs memiliki beberapa ruang nama: Satu untuk variabel, satu untuk fungsi dan makro, satu lagi untuk wajah, dan untuk tema, dan ...
Harald Hanche-Olsen
1
@ HaraldHanche-Olsen Anda tentu bisa mengatakan itu. Dalam konteks itu dia bertanya mengapa tidak ada ruang nama per paket.
Malabarba

Jawaban:

28

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:

  • Anda perlu mengubah cara simbol diinternir (ini adalah bagian yang mudah).
  • Byte-compiler perlu memahami ruang nama.
  • Generasi pengisian otomatis yang digunakan oleh package.elkebutuhan 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:

  • edebug
  • eval-defun
  • eval-last-sexp
  • lendir

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 :

Malabarba
sumber
1
Terima kasih - itu adalah pandangan yang sangat informatif tentang masalah ini. Saya ingin tahu tentang poin terakhir Anda: namessolusi 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.
Dan
1
@Dan Ya, ada. . Yang mengatakan, tidak ada alasan untuk tidak mengadopsi Nama sementara itu. Ini sepenuhnya kompatibel dengan konvensi Emacs, sehingga setiap paket yang menggunakan Nama bebas untuk berhenti menggunakan Nama kapan saja, dan pengguna tidak akan tahu apa-apa.
Malabarba
Anda benar-benar harus menambahkan namelesske daftar ini :) Ini adalah ide yang cemerlang, dan itu memecahkan masalah dengan sangat rapi.
Clément
22

Terakhir kali ini dibahas pada emacs-devel, diskusi berhenti ketika orang-orang seperti Lars menunjukkan bahwa mereka suka bisa melakukan M-x grepsesuatu. Menambahkan ruang nama ke Elisp seharusnya tidak terlalu sulit, tetapi mendapatkan semua alat yang sudah dikenal untuk menanganinya dengan benar adalah masalah lain.

Stefan
sumber
Saya pikir itu bisa dengan mudah 'diperbaiki' dengan membuat alias untuk fungsi-fungsi umum yang paling banyak digunakan (atau semuanya, mungkin)
Jesse
1
Kebutuhan untuk "grep" muncul biasanya saat mengembangkan paket, di mana Anda perlu tahu di mana variabel / fungsi dapat digunakan dalam paket lain, sehingga dapat diterapkan ke variabel / fungsi sewenang-wenang, daripada hanya untuk yang penting tertentu. Karena alasan ini, menambahkan beberapa alias tidak akan membuat perbedaan. Alasan lain mengapa mit tidak membantu, adalah bahwa menambahkan alias tidak akan membantu Anda menemukan penggunaan yang tidak menggunakan alias ini.
Stefan