Как определить функцию, которая повторяется при передаче аргумента - PullRequest
1 голос
/ 11 мая 2010

Есть ли простой способ определить функцию, которая повторяется при передаче аргумента?

Например, я определил следующую функцию

(defun swap-sign ()
  (interactive)
  (search-forward-regexp "[+-]")
  (if (equal (match-string 0) "-")
      (replace-match "+")
    (replace-match "-"))
  )

Мне бы хотелось C-u swap-sign, чтобы позвонить swap-sign четыре раза.

Я пытался

(defun swap-sign (&optional num)
  (interactive)
  (let ((counter 0)
 (num (if num (string-to-number num) 0)))
    (while (<= counter num)
      (search-forward-regexp "[+-]")
      (if (equal (match-string 0) "-")
   (replace-match "+")
 (replace-match "-"))           
      (setq counter (1+ counter)))))

, но C-u swap-sign все еще запускает только знак свопинга (или, точнее, телопетля) один раз.Я предполагаю, что это потому, что if num не правильный способ проверить, является ли num пустой строкой.

Я на правильном пути или есть лучший / более простой способ расширения swap-sign?

Ответы [ 2 ]

5 голосов
/ 11 мая 2010
(defun swap-sign (arg)
  (interactive "p")
  (dotimes (i arg)
    (search-forward-regexp "[+-]")
    (if (equal (match-string 0) "-")
        (replace-match "+")
      (replace-match "-"))))

См. Документацию специальной формы interactive для более подробной информации: C-h f interactive RET .

4 голосов
/ 11 мая 2010

Вы должны указать emacs ожидать и передать параметр, добавив «p» в качестве спецификации параметра для Interactive (M-x apropos interactive для получения документации). Здесь я внес минимальное изменение в ваш код, чтобы заставить его работать - заметьте, однако, что вам не нужно использовать let / while для выполнения итерации, и аргумент arg не должен быть необязательным.

(defun swap-sign (&optional num)
  (interactive "p")
  (let ((counter 1))
    (while (<= counter num)
      (search-forward-regexp "[+-]")
      (if (equal (match-string 0) "-")
      (replace-match "+")
    (replace-match "-"))           
      (setq counter (1+ counter)))))

Обратите внимание, что вам не нужно преобразовывать параметр из строки - использование "p" говорит emacs сделать это за вас.

...