E a cosa possono servire?
(interactive "p")
prende un argomento numerico dalla universal argument
destra? E l'argomentazione universale è solo un int in entrambi i casi, quindi cosa fa il capitale (interactive "P")
?
E a cosa possono servire?
(interactive "p")
prende un argomento numerico dalla universal argument
destra? E l'argomentazione universale è solo un int in entrambi i casi, quindi cosa fa il capitale (interactive "P")
?
Risposte:
Difficile credere che le persone lo abbiano descritto qui senza darvi anche collegamenti alle descrizioni di Emacs su questo:
Nel manuale di Emacs, nodo Argomenti .
Nel manuale Elisp, nodo Prefix Command Argomenti .
"Chiedi Emacs!": C-h i
, Scegliere un manuale,i prefix argument RET
.
In breve, anche se questo è detto abbastanza bene da altre risposte qui, ed è descritto in dettaglio nel manuale:
Il pref " arg " di prefisso fornisce valori di Lisp di diverso tipo, e in particolare distingue se l'utente ha effettivamente utilizzato un argomento prefisso (di qualsiasi tipo).
Usando, un programma può distinguere se l'utente ha utilizzato uno dei { -
, M--
, C--
} o uno dei { M-- 1
, C-- 1
, C-u -1
} (entrambi i quali hanno lo stesso valore del prefisso numerico -1
), e distinguere se s? Ha usato C-u C-u
o uno dei { M-16
, C-16
, C-u 16
} (entrambi i quali hanno un valore numerico 16) - tra molte altre distinzioni.
Ma la distinzione più importante è nil
vs non- nil
: molti comandi agiscono in modo diverso a seconda che l'utente usi un prefisso arg.
Il prefisso "numerico" arg è in realtà solo il valore prefix-numeric-value
restituito dalla funzione quando applicato al prefisso grezzo arg. IOW, è meglio pensare come una mappatura dall'interazione effettiva dell'utente grezzo a un numero intero.
Non si può dire se l'utente effettivamente utilizzato un argomento prefisso, perché il default di nessun argomento prefisso mappato l'intero 1, proprio come fa l'uso di C-u 1
, M-1
o C-1
.
Quando si utilizza il prefisso non elaborato Interactive Code "P"
, l'argomento viene trasmesso così com'è mentre "p"
converte l'arg in un numero.
Dopo aver valutato il seguente elisp, provare C-u M-x my/fn-with-num-arg
e quindi C-u M-x my/fn-with-raw-arg
vedere la differenza perché C-u
passa un argomento dell'elenco (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)
;; .
Anche l'argomento viene impostato per default sull'argomento 1
numerico ( "p"
) ma per impostazione predefinita su nil
o ()
per l'argomento grezzo ( "P"
).
I miei pochi centesimi: a volte, il fattore decisivo per se utilizzare "p"
o "P"
è se si desidera che l'argomento predefinito sia 1
o 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
o meno).
Solo per aggiungere un po 'più di dettaglio alla risposta di @ kaushalmodi (e utile test case):
L'argomento non elaborato consente di distinguere tra gli argomenti forniti con universal-argument
e digit-argument
.
Con un prefisso numerico arg non c'è modo di distinguere l'argomento universale C-u
da un prefisso arg di 4 (cioè C-4
). Con l'argomento grezzo questi sono diversi: (4)
vs 4
.
Lo stesso vale per negative-argument
. Come argomento grezzo puoi distinguere tra C--
e C-- 1
: il primo ti darà -
mentre il secondo -1
. Se convertiti in un argomento numerico, lo saranno entrambi -1
.
Quindi il vantaggio di usare un argomento grezzo è che ti dà più valori possibili. È possibile scrivere comandi che si comportano diversamente a seconda di come viene specificato l'argomento.
Ad esempio, dai un'occhiata alla stringa doc per yank
. Questo comando tratta C-u
e in modo C-4
diverso:
Con solo Cu come argomento, metti il punto all'inizio e segna alla fine. Con l'argomento N, reinserisci l'ennesimo omicidio più recente.
nil
rispetto1
, ma mai che avendo un avvoltoint
è preferibile ad una scartareint
. (Non posso votare fino a quando non ottengo 15 punti, tra l'altro).