Подтвердить что ты не робот

Почему "эксклюзивная линия" в Emacs используется только для интерактивного использования?

Какая проблема может возникнуть, если функция goto-line используется в неинтерактивной программе elisp? Его docstring дает предупреждение, говорящее, что:

Эта функция обычно используется неправильно в программе Lisp. Вместо этого вы скорее всего захотите:

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

Кроме того, когда я пытаюсь выполнить byte-compile-file мой файл инициализации, включая goto-line, я снова получаю неприятное предупреждение:

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

Использует ли goto-line в неинтерактивной программе действительно так опасно? Соответственно, почему рекомендуется предлагаемое решение forward-line?

4b9b3361

Ответ 1

Во-первых, это предотвращает попадание программистов Elisp в вредные привычки - написание неэффективный код, ориентированный на ряд строк. то есть вместо использования (forward-line 1) вычисление текущего номера строки, увеличение и использование goto-line.

Из this статья списка рассылки:

Вкратце, причина, по которой goto-line не должна быть часто используемая команда состоит в том, что, как правило, нет оснований для того, чтобы попасть в линию номер N, если у вас нет программы, которая рассказывала вам что-то интересно на этой линии.

Во-вторых, goto-line манипулирует пользовательской средой в дополнение к перемещению точка (т.е. push-mark). Для неинтерактивного использования это может быть не тем, что вы хотите. С другой стороны, если учесть все это, вы верите goto-line - это именно то, что вам нужно, а затем просто назовите его следующим образом:

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

И вы не получите никаких предупреждений компилятора.

Ответ 2

в дополнение к тому, что было сказано:

"goto-line", наконец, возвращается к "(форвардная линия (1- строка)", что фактически делает работу. Все остальные из 43 строк командного тела "goto-line" имеют дело с интерактивным использованием. пример с учетом возможно универсального аргумента.

При написании программы соответственно. при его запуске компьютер находится в другом состоянии, чем после интерактивного вызова. Таким образом, вы должны обратиться к этому состоянию, используя "прямую линию" прямо.