21

goto-line関数が非対話型elispプログラムで使用された場合、どのような問題が発生する可能性がありますか?そのdocstringは、次のような警告を出します。

この関数は通常、Lispプログラムで使用するのは間違っています。代わりにおそらく必要なのは、次のようなものです。

(goto-char (point-min)) (forward-line (1- N))

さらに、をbyte-compile-file含むinitファイルを試してみると、goto-line次のような不快な警告が再び表示されます。

.emacs:170:19:Warning: `goto-line' used from Lisp code
That command is designed for interactive use only

goto-line非対話型プログラムでの使用は本当に危険ですか?関連して、提案されたforward-lineソリューションが好ましいのはなぜですか?

4

2 に答える 2

30

第一に、これはElispプログラマーが悪い習慣に陥るのを防ぎます-行番号中心の方法で非効率的なコードを書くことです。(forward-line 1)つまり、現在の行番号の計算、インクリメント、およびを 使用する代わりに goto-line

このメーリングリストの記事から:

一言で言えば、goto-lineが頻繁に使用されるコマンドであってはならない理由は、通常、行番号Nに何か面白いことがあると通知するプログラムがない限り、その行番号Nに到達する理由がないためです。

次に、goto-lineは、ポイントの移動に加えて、ユーザーの環境を操作します(つまりpush-mark)。非対話型の使用の場合、これはあなたが望むものではないかもしれません。一方、これらすべてを考慮した場合、goto-lineがまさに必要なものであると信じているので、次のように呼び出します。

(defun foo ()
  (interactive)
  (with-no-warnings
    (goto-line N)))

また、コンパイラの警告は表示されません。

于 2012-08-04T04:25:13.333 に答える
6

言われたことに加えて:

「goto-line」は最終的に「(forward-line(1-line)」に戻り、実際に機能します。「goto-line」コマンド本体の他の43行はすべて、インタラクティブな使用を扱います。たとえば、おそらく普遍的な議論。

プログラムを書くとき、それぞれ。それを実行しているとき、あなたのコンピュータはインタラクティブな呼び出しに従うこととは別の状態にあります。したがって、「フォワードライン」を直接使用してこの状態に対処する必要があります。

于 2012-08-04T06:31:57.683 に答える