elispに名前空間がないのはなぜですか?


40

Q: elispに名前空間がないのはなぜですか?どのようにして取得できますか?

Elispには、グローバル以外の名前空間はありません。これにより、すべてのグローバル関数、変数、および定数に一意のプレフィックスを付けるというコーディング規則が生まれました。

迷惑な要因は別として、1)増え続けるすばらしいライブラリとパッケージ、2)プレフィックスの規則を尊重しないレガシー関数と変数の継続的な存在、または使用できる適切なプレフィックスオプションが実際にはないほど十分に特異です。また、(からclへの移行のようにcl-lib)古いコードを合理化しようとする定期的な試行は、重要な作業です。(クリーンアップはうれしいですが、のように入力するたびに涙を流しcl-findます)。

数十年使用してもelispにまだ名前空間がないのかどうかを調べてみましたが、適度な収穫には少し驚いていました。名前空間上のwikiページはかなり短いです。 Nic Ferrierはこの問題を少し長めに処理しており、emacs-develにもかなり最近のスレッドがあります。マクロを使用して名前空間を実装する可能性を議論する2010年の古いStack Overflowスレッドがあります。マクロアプローチの別の例はここで見つけることができます。少なくともいくつかの実装があります(ここここ、後者の説明はこちら)そこにありますが、彼らはここ数年あまり活動していませんし、私はそれらを使用するライブラリに出くわしていません。

名前空間の追加が簡単であれば、既に行われていると思います。そう:

  • elispに名前空間を追加するための技術的な障壁は何ですか?
  • 名前空間を追加すると、既存のコードの多くが壊れますか?
  • この機能は、elisp(インタープリター自体の変更)に対して有機的である必要がありますか、それとも実際にマクロを介して構築できますか?

6
これを見ることができます:github.com/Bruce-Connor/names自動ネームスペースの後方互換性(現在の手動による名前の分離方法)の実装のようです。(そして、私はこのようなライブラリをもう1つ見たことがあると99%確信しています。開発者は名前空間を持つ関数のサブセットをエクスポートできます。最近いくつかのemacsブログで言及しましたが、それを見つけることができませんでした)。
T.バーロン14年

2
次に、上記のリンクをご覧ください。これは非常に最近の(先月リリースされた)非常に堅牢な名前空間マクロです。edebugのようなツールとの互換性に関して、まだいくつかの問題を解決していますが、パッケージは動作します。あなたの質問に答えることは本当に長いエッセイです(私が直面した技術的障壁は多くありました)が、今後数週間にわたってブログ投稿にそれを入れようとします。
マラバルバ14年

1
名前空間にはさまざまな意味があると思います。変数の一つ、関数やマクロのための別の、もう一つの顔用、およびテーマのために、そして...:私はEmacsは、いくつかの名前空間があると述べているだろう
ハラルドHanche-オルセン

1
@ HaraldHanche-Olsenあなたは確かにそれを言うことができます。その文脈で、彼はパッケージごとの名前空間がない理由を尋ねています。
マラバルバ14年

回答:


28

なぜ名前空間がないのですか?

それは複雑で、誰もまだ急落するほど緊急であるとは考えていないからです。これは以前に(1回以上)devリストで議論されており、gitへの移行後にこれを修正する約束がありました。

それまでの間、私は独自のソリューションを作成しました(オプションのリストについては以下を参照してください)。

技術的な障壁は何ですか?

ドアの外には、3つの大きな障害があります。これらの障害を乗り越えて、ネームスペースが現在のEmacsで作業する機会を得る必要があります。

  • シンボルのインターン方法を変更する必要があります(これは簡単な部分です)。
  • バイトコンパイラは名前空間を理解する必要があります。
  • によって使用される自動ロード生成は、package.el名前空間を理解する必要があります。

名前空間を実装するためにこれらの3つのものにパッチを適用することは簡単ではありません。最新のEmacsバージョンのみに専念している場合、それは確かに実行可能です。以前のバージョン(24ファミリ全体など)もサポートする何らかのパッケージを作成しようとしている場合、それは1つの難問になります。

それ以外にも、オプションの障害物が山ほどあります。elispのはあなたに利用可能なツールであるため、すべてのパワーを大きく、ALL これらの名前空間で動作するようにパッチを適用する必要があります。最も重要なものは次のとおりです。

  • edebug
  • eval-defun
  • eval-last-sexp
  • スライム

既存のコードの多くを壊すでしょうか?

正しくやらないと

これはオーガニックである必要がありますか、それともマクロを介して最上位に構築できますか?

理想的にはオーガニックであり、それは開発リストに掲載されるときに通常議論されるものです。しかし、上に構築されている間は十分に良くすることができます。
以下に、このリストから取ったいくつかの例を示します


1
おかげで-それは問題について非常に有益な意見でした。あなたの最後のポイントre:あなたのnames解決策に興味があります。内蔵のソリューション、有機は、そう遠くない将来に来ていると疑うに、あるいは我々だけで内蔵を採用すべきであるならばどのような理由があります場合、私は疑問ご提供いただいたソリューションを。
ダン

1
@Dan はい、あります。。そうは言っても、その間にNamesを採用しない理由はありません。Emacsの規則と完全に互換性があるため、Namesを使用するパッケージはいつでもNamesの使用を停止でき、ユーザーはそのことを知りません。
マラバルバ14年

あなたは本当にnamelessこのリストに追加する必要があります:)それは素晴らしいアイデアであり、問​​題を非常にきれいに解決します。
クレメント

22

前回emacs-develで議論されたとき、Larsのような人々M-x grepが何かのためにできることが好きだと指摘したとき、議論は停止しました。Elispに名前空間を追加するのはそれほど難しいことではありませんが、それらを適切に処理するための使い慣れたツールをすべて取得することは別の問題です。


最もよく使用される一般的な関数(またはそれらのすべて)のエイリアスを作成することで簡単に「修正」できると思います
-Jesse

1
「grep」の必要性は通常、パッケージの開発中に現れます。他のパッケージのどこで変数/関数が使用されるかを知る必要があるので、特定の重要なものだけでなく、任意の変数/関数に適用できます。このため、いくつかのエイリアスを追加しても違いはありません。mitが役に立たないもう1つの理由は、エイリアスを追加しても、このエイリアスを使用しない用途を見つけるのに役立たないことです。
ステファン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.