И для чего они могут быть использованы?
(interactive "p")принимает числовой аргумент universal argumentсправа? И универсальный аргумент - это просто int в любом случае, так что же делает капитал (interactive "P")?
И для чего они могут быть использованы?
(interactive "p")принимает числовой аргумент universal argumentсправа? И универсальный аргумент - это просто int в любом случае, так что же делает капитал (interactive "P")?
Ответы:
Трудно поверить, что люди описали это здесь, не дав вам ссылки на собственные описания Emacs:
В руководстве по Emacs, узел Аргументы .
В руководстве Elisp, Аргументы команды Prefix узла .
"Спросите Emacs!": C-h i Выберите руководство,i prefix argument RET.
В двух словах, хотя об этом достаточно хорошо сказано в других ответах здесь, и подробно описано в руководстве:
«Сырой» префикс Arg обеспечивает значения лисповские различных видов, и , в частности , он различает , действительно ли или нет пользователь использует префикс аргумент (любого вида).
С его помощью, программа может различать ли использоваться пользователь одного из { -, M--, C--} или один из { M-- 1, C-- 1, C-u -1} (оба из которых имеют тот же числовое значение префикс -1), и отличить ли ей? Он использовал C-u C-uили один из { M-16, C-16, C-u 16} (оба имеют числовое значение 16) - среди множества других различий.
Но самое важное такое различие - это nilне- nil: многие команды действуют по-разному в зависимости от того, использует ли пользователь префикс arg.
«Числовой» префикс аргумент действительно только значение , которое функция prefix-numeric-valueвозвращает при применении к сырой приставке арг. Таким образом, это лучше всего рассматривать как отображение фактического необработанного взаимодействия с пользователем в целое число.
Он не может сказать вам , действительно ли пользователь использовал префикс аргумент, так как по умолчанию без префикса аргумента сопоставляется с целым числом 1, так же как и использование C-u 1, M-1или C-1.
При использовании необработанного префикса « Интерактивный код» "P" аргумент передается как есть, тогда "p"как аргумент преобразуется в число.
После оценки ниже elisp, попробуйте C-u M-x my/fn-with-num-argи затем, C-u M-x my/fn-with-raw-argчтобы увидеть разницу, потому что C-uпередает аргумент списка (4).
(defun my/debug-fn (arg)
(let ((msg))
(if (numberp arg)
(setq msg (format "Argument is number %s. " (pp arg)))
(setq msg "Argument is not a number. "))
(if (listp arg)
(setq msg (concat msg (format "Arg is %s." (pp arg))))
(setq msg (concat msg "Argument is not a list.")))
(message msg)))
(defun my/fn-with-num-arg (arg)
(interactive "p")
(my/debug-fn arg))
;; Result of C-u M-x my/fn-with-num-arg :
;; Argument is number 4. Argument is not a list.
(defun my/fn-with-raw-arg (arg)
(interactive "P")
(my/debug-fn arg))
;; Result of C-u M-x my/fn-with-raw-arg :
;; Argument is not a number. Arg is (4)
;; .
Также аргумент по умолчанию 1для числового аргумента ( "p"), но по умолчанию nilили ()для необработанного аргумента ( "P").
Мои несколько центов: время от времени решающим фактором для использования "p"или "P"является ли вы хотите, чтобы аргумент по умолчанию был 1или nil.
;; Result of M-x my/fn-with-num-arg :
;; Argument is number 1. Argument is not a list.
;; Result of M-x my/fn-with-raw-arg :
;; Argument is not a number. Arg is nil.
nil).
Просто добавьте немного подробностей в ответ @ kaushalmodi (и полезный тестовый пример):
Необработанный аргумент позволяет вам различать аргументы, поставляемые с universal-argumentи digit-argument.
С числовым префиксом arg невозможно отличить универсальный аргумент C-uот префикса arg, равного 4 (т.е. C-4). С сырым аргументом они различны: (4)против 4.
То же самое относится и к negative-argument. В качестве исходного аргумента вы можете различить C--и C-- 1: первое даст вам, -а второе -1. При преобразовании в числовой аргумент они оба будут -1.
Таким образом, преимущество использования необработанного аргумента состоит в том, что он дает вам больше возможных значений. Вы можете писать команды, которые ведут себя по-разному, в зависимости от того, как указан аргумент.
В качестве примера рассмотрим строку документа для yank. Эта команда обрабатывает C-uи по- C-4разному:
Используя только Cu в качестве аргумента, поставьте точку в начале и отметьте в конце. С аргументом N повторно вставьте N-е самое последнее уничтожение.
nilчем1, но никогда не бывает, что иметь завернутую упаковкуintпредпочтительнее, чем развернутуюint. (Не могу проголосовать до 15 баллов, кстати).