オートロードと変数


8

私は関数のオートロードの機能を理解しています(そのような関数が呼び出されたとき、またはそのドキュメント文字列が取得されたときにロードするファイルを登録します)。ただし、変数やマクロと組み合わせてオートロード機能を使用する方法は明確ではありません。

2つの質問があります。

  1. パッケージにパラメーターがあり、ユーザーが設定できる変数として実装されているが、自動ロードされない場合はどうなりますか?そのような変数はオートロードされるべきですか?そうでない場合、そのような変数は存在しないことがわかります。Lisp環境は、パッケージからオートロードされた関数が使用されるまで(通常は構成ファイルのロード後)、ユーザーが変数を設定するまで、デフォルト値を含め、それらについて何も知りません。 /彼女の設定ファイル、それは存在しない変数を設定するようなものです。変数の値が空でないリストであり、ユーザーがその値を使用pushまたはadd-to-list変更する場合、正確にはどうなりますか?デフォルト値は失われますか?

  2. マクロがオートロードされるとどうなりますか?いつマクロをオートロードする必要がありますか?

回答:


5

自動ロードは、シンボルの関数値スロットにのみ適用されます。特に、変数をオートロードするようなものはありません。

その場合、変数をカスタマイズすることが難しくなるため、パッケージがユーザーカスタマイズ用の変数を含み、そのデフォルト値が空でないリストであるのは、おそらく不適切な形式です。さらに悪いことに、デフォルト値が変更された場合、カスタマイズされた値も変更されるはずですが、ユーザーはそれを認識しません。一部のパッケージにそのような変数がある場合は、パッケージのロード後にを使用して変更するのが最善の場合がありますeval-after-load

ほとんどのカスタマイズ変数のデフォルト値はです。nilこの場合setq、initファイルで使用して設定するだけです(またはカスタマイズインターフェイスを使用します)。パッケージが変数を使用するdefvardefcustom、または変数を設定することを想定している場合、それは必要に応じて、設定をオーバーライドしません。

マクロの自動読み込み:の5番目の引数を設定して、autoloadこれを実現します。関数と同様に、明示的に、またはパッケージから他の自動ロードされたシンボルを最初に呼び出すことによって暗黙的に、パッケージを最初にロードせずにマクロを使用したい場合は、これを行う必要があります。

補遺: OPがコメントで指摘したように、魔法の;;;###autoloadコメントもdefvar(実際には、elispフォーム)をオートロードファイルにコピーします。詳細については、elispマニュアルの「オートロード」セクションを参照してください。


したがって、setqedするだけの変数(つまり、以前の値は関係ない)には、デフォルトで、defvarまたはdefcustomフォームで指定できますが、ユーザーが拡張できるリストの場合は、eval-after-load正しく使用するのが最善でしょうか。また、リストの形式をとっても、デフォルトが適切な場合もあります;-)
Mark Karpov

そのとおり。一般的なカスタマイズが必要な場合eval-after-load、それはパッケージ実装のバグだと私は主張します。通常、eval-after-loadバグ修正や非常に珍しいカスタマイズに使用する必要があります。ちなみに、パッケージがフックを使用できるようにする場合は、フックを使用する方がよい場合があります。
Harald Hanche-Olsen 2015

問題は、3つの要素(デフォルト)のリストにバインドされた変数が必要だったことです。デフォルトはほとんどのユーザーが望むものだと私は確信しています。しかし、私がうまくいけばeval-after-load、ユーザーはまだリストから要素を削除することができません!これは私がデフォルトをすべて放棄する必要があるのか​​と疑問に思います。
Mark Karpov、2015

1
eval-after-load異常な状況でのみ必要であることに同意しません。これは、遅延読み込みツールキットの標準ツールの1つです。人々がそのようなツールを使いたくない場合はrequire、事前にライブラリを使用できます(これは確かに、初心者が常に行うことをお勧めします)。おそらく、新しい構文に恐れをなさないように十分に学習しました:)
phils '13 / 07/13

1
@Drew:良いとcustomize-set-variableいうよりsetqは、使用するというあなたのポイント。しかし、この点に関して私の答えを改善するために必要な注意深い研究をする時間は今ありません。これが大事だと思ったら自分で答えてみませんか?この長いコメントスレッドよりも見やすくなります。
Harald Hanche-Olsen 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.