* Rationale behind conversion of a nil prefix arg to numeric 1 @ 2016-09-04 12:23 Florian v. Savigny 2016-09-04 14:23 ` Eli Zaretskii 2016-09-15 12:47 ` Thien-Thi Nguyen 0 siblings, 2 replies; 31+ messages in thread From: Florian v. Savigny @ 2016-09-04 12:23 UTC (permalink / raw) To: help-gnu-emacs Hi there, I've written one or two functions whose invocation I modeled on Unix file permission bits (where a single digit is always unambiguously either 1, 2 and 4 or some sum of them; thus, possible values are 1, 2, 3 (1 + 2), 4, 5 (1 + 4), 6 (2 + 4) and 7 (1 + 2 + 4)) because I felt it was quite a nifty way of passing a command zero, one, two or three "flags" at once via an optional prefix argument. (Apart from the fact that it's quite easy to forget which number means which flag.) Naively, I used the numeric conversion of the prefix arg, i.e. (interactive "p") which passes the prefix arg converted to a number. However, if I call the function with no prefix argument, which is, expectedly, nil in raw form, it converts this to the number 1. (This is what `prefix-numeric-value' does, as explained in the docstring.) While I understand that this is how it is done, I am quite puzzled about the logic behind this. It would seem intuitive to me to convert nil to either the number 0 or, again, nil, but never to the number 1. And practically, converting nil to 1 has the consequence that calling the command with no prefix arg: M-x command is exactly the same as calling it with a prefix arg of 1: C-u 1 M-x command because the prefix arg converted to a number is 1 in both cases, which reduces the number of possibilities of calling the command by one. I can circumvent this (and get the behaviour that I would expect) by writing the function with (if current-prefix-arg (prefix-numeric-value current-prefix-arg)) in an explicit interactive list, but I am still wondering about the rationale of representing nil as the number one. Does this make sense, or is it useful, in some way? Thanks for any enlightenment! Florian -- Florian von Savigny Melanchthonstr. 41 33615 Bielefeld ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-04 12:23 Rationale behind conversion of a nil prefix arg to numeric 1 Florian v. Savigny @ 2016-09-04 14:23 ` Eli Zaretskii 2016-09-04 17:11 ` Andreas Röhler ` (2 more replies) 2016-09-15 12:47 ` Thien-Thi Nguyen 1 sibling, 3 replies; 31+ messages in thread From: Eli Zaretskii @ 2016-09-04 14:23 UTC (permalink / raw) To: help-gnu-emacs > Date: Sun, 04 Sep 2016 14:23:35 +0200 > From: florian@fsavigny.de (Florian v. Savigny) > > Naively, I used the numeric conversion of the prefix arg, i.e. > > (interactive "p") > > which passes the prefix arg converted to a number. However, if I call > the function with no prefix argument, which is, expectedly, nil in raw > form, it converts this to the number 1. (This is what > `prefix-numeric-value' does, as explained in the docstring.) > > While I understand that this is how it is done, I am quite puzzled > about the logic behind this. It would seem intuitive to me to convert > nil to either the number 0 or, again, nil, but never to the number > 1. And practically, converting nil to 1 has the consequence that > calling the command with no prefix arg: > > M-x command > > is exactly the same as calling it with a prefix arg of 1: > > C-u 1 M-x command > > because the prefix arg converted to a number is 1 in both cases, which > reduces the number of possibilities of calling the command by one. > > I can circumvent this (and get the behaviour that I would expect) by > writing the function with > > (if current-prefix-arg (prefix-numeric-value current-prefix-arg)) > > in an explicit interactive list, but I am still wondering about the > rationale of representing nil as the number one. Does this make sense, > or is it useful, in some way? Yes. Most commands use the argument as a repeat count, so having it default to one makes perfect sense. ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-04 14:23 ` Eli Zaretskii @ 2016-09-04 17:11 ` Andreas Röhler 2016-09-04 18:33 ` Eli Zaretskii 2016-09-04 22:53 ` Florian v. Savigny [not found] ` <<87d1kjjmys.fsf@bertrandrussell.Speedport_W_723V_1_40_000> 2 siblings, 1 reply; 31+ messages in thread From: Andreas Röhler @ 2016-09-04 17:11 UTC (permalink / raw) To: help-gnu-emacs On 04.09.2016 16:23, Eli Zaretskii wrote: >> Date: Sun, 04 Sep 2016 14:23:35 +0200 >> From: florian@fsavigny.de (Florian v. Savigny) >> >> Naively, I used the numeric conversion of the prefix arg, i.e. >> >> (interactive "p") >> >> which passes the prefix arg converted to a number. However, if I call >> the function with no prefix argument, which is, expectedly, nil in raw >> form, it converts this to the number 1. (This is what >> `prefix-numeric-value' does, as explained in the docstring.) >> >> While I understand that this is how it is done, I am quite puzzled >> about the logic behind this. It would seem intuitive to me to convert >> nil to either the number 0 or, again, nil, but never to the number >> 1. And practically, converting nil to 1 has the consequence that >> calling the command with no prefix arg: >> >> M-x command >> >> is exactly the same as calling it with a prefix arg of 1: >> >> C-u 1 M-x command >> >> because the prefix arg converted to a number is 1 in both cases, which >> reduces the number of possibilities of calling the command by one. >> >> I can circumvent this (and get the behaviour that I would expect) by >> writing the function with >> >> (if current-prefix-arg (prefix-numeric-value current-prefix-arg)) >> >> in an explicit interactive list, but I am still wondering about the >> rationale of representing nil as the number one. Does this make sense, >> or is it useful, in some way? > Yes. Most commands use the argument as a repeat count, so having it > default to one makes perfect sense. > There a difference between "p" sending 1 and nil - which is the result from non-interactive use. If a function needs a repeat count, it should provide some. ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-04 17:11 ` Andreas Röhler @ 2016-09-04 18:33 ` Eli Zaretskii 2016-09-05 7:16 ` Andreas Röhler 0 siblings, 1 reply; 31+ messages in thread From: Eli Zaretskii @ 2016-09-04 18:33 UTC (permalink / raw) To: help-gnu-emacs > From: Andreas Röhler <andreas.roehler@easy-emacs.de> > Date: Sun, 4 Sep 2016 19:11:31 +0200 > > >> I am still wondering about the > >> rationale of representing nil as the number one. Does this make sense, > >> or is it useful, in some way? > > Yes. Most commands use the argument as a repeat count, so having it > > default to one makes perfect sense. > > > > There a difference between "p" sending 1 and nil - which is the result > from non-interactive use. "p" is documented as the _numeric_ value of the argument. So it obviously cannot yield nil. > If a function needs a repeat count, it should provide some. That'd mean changes in 90% of commands. Quite silly, I'd say. In any case, the OP asked what was the rationale, and I tried to answer that. Whether or not Emacs should have been designed differently is another argument for another rainy day. ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-04 18:33 ` Eli Zaretskii @ 2016-09-05 7:16 ` Andreas Röhler 2016-09-05 14:56 ` Eli Zaretskii 2016-09-05 17:04 ` Drew Adams 0 siblings, 2 replies; 31+ messages in thread From: Andreas Röhler @ 2016-09-05 7:16 UTC (permalink / raw) To: help-gnu-emacs On 04.09.2016 20:33, Eli Zaretskii wrote: >> From: Andreas Röhler <andreas.roehler@easy-emacs.de> >> Date: Sun, 4 Sep 2016 19:11:31 +0200 >> >>>> I am still wondering about the >>>> rationale of representing nil as the number one. Does this make sense, >>>> or is it useful, in some way? >>> Yes. Most commands use the argument as a repeat count, so having it >>> default to one makes perfect sense. >>> >> There a difference between "p" sending 1 and nil - which is the result >> from non-interactive use. > "p" is documented as the _numeric_ value of the argument. So it > obviously cannot yield nil. The ideosyncrasy: it yields the same value for arg = 1 as if no arg were given: (defun foo (&optional arg) (interactive "p") (message "My ARG: %s" arg) (message "Value of arg: %s" (prefix-numeric-value arg))) ;; called without ARG (foo) ==> "My ARG: nil" ==> "Value of arg: 1" ;; called without ARG 1 (foo 1) ==> "My ARG: 1" ==> "Value of arg: 1" Regardless of its purpose - such coding style should not be encouraged. It would be easy and consistent to write (or arg (setq arg 1)) ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-05 7:16 ` Andreas Röhler @ 2016-09-05 14:56 ` Eli Zaretskii 2016-09-05 15:22 ` Kaushal Modi 2016-09-05 17:04 ` Drew Adams 1 sibling, 1 reply; 31+ messages in thread From: Eli Zaretskii @ 2016-09-05 14:56 UTC (permalink / raw) To: help-gnu-emacs > From: Andreas Röhler <andreas.roehler@easy-emacs.de> > Date: Mon, 5 Sep 2016 09:16:00 +0200 > > The ideosyncrasy: it yields the same value for arg = 1 as if no arg were > given: Commands that need to distinguish between those should not use "p". ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-05 14:56 ` Eli Zaretskii @ 2016-09-05 15:22 ` Kaushal Modi 2016-09-05 16:32 ` Drew Adams 2016-09-05 18:41 ` Andreas Röhler 0 siblings, 2 replies; 31+ messages in thread From: Kaushal Modi @ 2016-09-05 15:22 UTC (permalink / raw) To: Help Gnu Emacs mailing list, Andreas Röhler Exactly. Just treat the "p" (lowercase p) interactive form as the special case where you only need to deal with numeric arguments and the default numeric argument is 1. If you need to deal with numeric, nil and other non-numeric arguments like (4), (16), etc, use the "P" (uppercase p) interactive form. The "P" interactive form passes the args to the function in their raw, untouched form. On Mon, Sep 5, 2016, 8:57 AM Eli Zaretskii <eliz@gnu.org> wrote: > > Commands that need to distinguish between those should not use "p". > -- Kaushal Modi ^ permalink raw reply [flat|nested] 31+ messages in thread
* RE: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-05 15:22 ` Kaushal Modi @ 2016-09-05 16:32 ` Drew Adams 2016-09-05 18:41 ` Andreas Röhler 1 sibling, 0 replies; 31+ messages in thread From: Drew Adams @ 2016-09-05 16:32 UTC (permalink / raw) To: Kaushal Modi, Help Gnu Emacs mailing list, Andreas Röhler > > Commands that need to distinguish between those should not use "p". > > Exactly. > Just treat the "p" (lowercase p) interactive form as the special case > where you only need to deal with numeric arguments and the default numeric > argument is 1. > > If you need to deal with numeric, nil and other non-numeric arguments like > (4), (16), etc, use the "P" (uppercase p) interactive form. The "P" > interactive form passes the args to the function in their raw, untouched > form. What Eli and Kaushal said. Again, this is a _feature_. You just need to learn what it is about (and what it is not about). The doc is quite clear - give it a try. In particular, if your code wants to know WHETHER a prefix argument was EXPLICITLY provided by the USER, then you need to test the RAW prefix argument. If you then want to know what the NUMERIC value is, use `prefix-numeric-value': (defun foo (arg) (interactive "P") ; <=== uppercase P: RAW prefix arg (if (not arg) (no-prefix-arg-provided---usual/default-case) (let ((nval (prefix-numeric-value arg))) (cond ((= 42 nval) (answer-to-everything-it-seems)) ((> nval 0) (at-least-its-positive)) ((< nval 0) (so-negative!)) (t (nothing-at-all)))))) If you want to check for PARTICULAR non-nil raw prefix values: (if (not arg) (no-prefix-arg-provided---usual/default-case) (cond ((= arg '-) (handle-M--)) ((= arg '-42) (handle-M---4-2-or-C-u---4-2)) ; etc. ((= arg '4) (handle-M-4--or-C-u-4)) ((and (consp arg) (= 4 (car arg))) (handle-plain-C-u)) ((and (consp arg) (= 16 (car arg))) (handle-plain-C-u-C-u)) ...)) Note that `C-u' gives `(4)' as the raw prefix arg, and `C-u 4' gives `4' as the raw prefix arg. And `prefix-numeric-value' gives `4' in both cases. Experiment: (defun foo (arg) "Show the raw prefix arg and its numeric value." (interactive "P") (message "ARG: %S, Numeric value: %S" arg (prefix-numeric-value arg))) The case that this thread is about is just this one: `M-x foo'. (Much ado about nothing.) ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-05 15:22 ` Kaushal Modi 2016-09-05 16:32 ` Drew Adams @ 2016-09-05 18:41 ` Andreas Röhler 2016-09-05 19:02 ` Eli Zaretskii 1 sibling, 1 reply; 31+ messages in thread From: Andreas Röhler @ 2016-09-05 18:41 UTC (permalink / raw) To: Kaushal Modi, Help Gnu Emacs mailing list On 05.09.2016 17:22, Kaushal Modi wrote: > Exactly. > > Just treat the "p" (lowercase p) interactive form as the special case > where you only need to deal with numeric arguments and the default > numeric argument is 1. > > If you need to deal with numeric, nil and other non-numeric arguments > like (4), (16), etc, use the "P" (uppercase p) interactive form. The > "P" interactive form passes the args to the function in their raw, > untouched form. Leaving out the argument with uppercased P, it sends nil --correct-- whose numeric value is considered 1 again. Understand it might be considered a feature, but think the caused inconsistency weights in more. ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-05 18:41 ` Andreas Röhler @ 2016-09-05 19:02 ` Eli Zaretskii 2016-09-06 7:10 ` tomas 2016-09-06 7:22 ` Andreas Röhler 0 siblings, 2 replies; 31+ messages in thread From: Eli Zaretskii @ 2016-09-05 19:02 UTC (permalink / raw) To: help-gnu-emacs > Cc: Eli Zaretskii <eliz@gnu.org> > From: Andreas Röhler <andreas.roehler@online.de> > Date: Mon, 5 Sep 2016 20:41:22 +0200 > > Leaving out the argument with uppercased P, it sends nil --correct-- > whose numeric value is considered 1 again. > > Understand it might be considered a feature, but think the caused > inconsistency weights in more. So you also disagree with nil meaning "the default value", do you? Because, according to you, nil cannot possibly stand for any value but zero, without risking to be "inconsistent", is that right? But if you do accept that nil can stand for the default value, why cannot you accept that in the case of repeat count it stands for 1, i.e. that 1 is the default value in this context? ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-05 19:02 ` Eli Zaretskii @ 2016-09-06 7:10 ` tomas 2016-09-06 9:45 ` Florian v. Savigny 2016-09-06 7:22 ` Andreas Röhler 1 sibling, 1 reply; 31+ messages in thread From: tomas @ 2016-09-06 7:10 UTC (permalink / raw) To: help-gnu-emacs -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On Mon, Sep 05, 2016 at 10:02:02PM +0300, Eli Zaretskii wrote: > > Cc: Eli Zaretskii <eliz@gnu.org> > > From: Andreas Röhler <andreas.roehler@online.de> > > Date: Mon, 5 Sep 2016 20:41:22 +0200 > > > > Leaving out the argument with uppercased P, it sends nil --correct-- > > whose numeric value is considered 1 again. > > > > Understand it might be considered a feature, but think the caused > > inconsistency weights in more. > > So you also disagree with nil meaning "the default value", do you? Alternatively, for Andreas the axiom "the default value is always 0" holds ;-P (no offense meant, but I just couldn't... resist ;-) regards - -- t -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iEYEARECAAYFAlfOa9cACgkQBcgs9XrR2kaU1gCeNN4AKiZGn5fvhGLgBcwpYX43 exEAnjSe6SGxVEY6E4RsiMV5lW53Ryyp =T1bW -----END PGP SIGNATURE----- ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-06 7:10 ` tomas @ 2016-09-06 9:45 ` Florian v. Savigny 2016-09-06 10:27 ` tomas 2016-09-06 11:27 ` Andreas Röhler 0 siblings, 2 replies; 31+ messages in thread From: Florian v. Savigny @ 2016-09-06 9:45 UTC (permalink / raw) To: help-gnu-emacs > Alternatively, for Andreas the axiom "the default value is always 0" > holds ;-P I do sympathise with him, because my question started out supposing exactly the same thing. It just seems intuitive that nil translates to the number 0, if any, and when things are intuitive, this is (I think) generally good. It all becomes immediately clear when you understand that the numeric prefix arg has a special purpose, i.e. is conceived as a repeat counter (and NOT simply a number), but only then. In other words, `prefix-arg-as-repeat-counter' might be the kind of name that would be more readily understandable (and would even arguably be more accurate) than `prefix-numeric-value'. -- Florian von Savigny Melanchthonstr. 41 33615 Bielefeld ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-06 9:45 ` Florian v. Savigny @ 2016-09-06 10:27 ` tomas 2016-09-06 11:27 ` Andreas Röhler 1 sibling, 0 replies; 31+ messages in thread From: tomas @ 2016-09-06 10:27 UTC (permalink / raw) To: help-gnu-emacs -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On Tue, Sep 06, 2016 at 11:45:28AM +0200, Florian v. Savigny wrote: > > > > Alternatively, for Andreas the axiom "the default value is always 0" > > holds ;-P > > I do sympathise with him, because my question started out supposing > exactly the same thing. It just seems intuitive that nil translates to > the number 0, if any, and when things are intuitive, this is (I think) > generally good. Definitely. Andreas' viewpoint is in some way understandable. > It all becomes immediately clear when you understand that the numeric > prefix arg has a special purpose, i.e. is conceived as a repeat > counter (and NOT simply a number), but only then. In other words, > `prefix-arg-as-repeat-counter' might be the kind of name that would be > more readily understandable (and would even arguably be more accurate) > than `prefix-numeric-value'. I.e. "when the action is multiplicative, use the multiplicative neutral element (i.e. 1) as default, not the additive (ie. 0) ;-) But I'll shut up now. regards and thanks for your lenience - -- t -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iEYEARECAAYFAlfOmi0ACgkQBcgs9XrR2karDgCfQaGjbKee0Mal3uWFra1zyyZA NDsAn3N/VAm6Vxzt+ddMBtitINtiXO7k =sy/y -----END PGP SIGNATURE----- ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-06 9:45 ` Florian v. Savigny 2016-09-06 10:27 ` tomas @ 2016-09-06 11:27 ` Andreas Röhler 2016-09-06 13:27 ` Florian v. Savigny 2016-09-06 14:20 ` Kaushal Modi 1 sibling, 2 replies; 31+ messages in thread From: Andreas Röhler @ 2016-09-06 11:27 UTC (permalink / raw) To: help-gnu-emacs On 06.09.2016 11:45, Florian v. Savigny wrote: > > Alternatively, for Andreas the axiom "the default value is always 0" > > holds ;-P > > I do sympathise with him, because my question started out supposing > exactly the same thing. It just seems intuitive that nil translates to > the number 0, if any, and when things are intuitive, this is (I think) > generally good. > > It all becomes immediately clear when you understand that the numeric > prefix arg has a special purpose, i.e. is conceived as a repeat > counter (and NOT simply a number), but only then. In other words, > `prefix-arg-as-repeat-counter' might be the kind of name that would be > more readily understandable (and would even arguably be more accurate) > than `prefix-numeric-value'. IIUC `prefix-numeric-value' is a more complex thing than providing a repeat counter - which it does for lower p. prefix-numeric-value of C-u is 4 in contrast. But let's go back to the simplest case of lower p in interactive spec: What is easier to read/grasp (setq counter (or arg 1) or (setq counter (prefix-numeric-value arg)) IOW: in favor of avoiding these complex, tricky things. Let's have the code as explicit as possible. ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-06 11:27 ` Andreas Röhler @ 2016-09-06 13:27 ` Florian v. Savigny 2016-09-06 15:22 ` Drew Adams 2016-09-06 14:20 ` Kaushal Modi 1 sibling, 1 reply; 31+ messages in thread From: Florian v. Savigny @ 2016-09-06 13:27 UTC (permalink / raw) To: help-gnu-emacs > IIUC `prefix-numeric-value' is a more complex thing than providing a > repeat counter - which it does for lower p. I thought I had understood that (interactive (list (prefix-numeric-value current-prefix-arg))) was exactly the same as (interactive "p") Or isn't it? Then I am really confused. (But a test I just ran seems to confirm that it is.) > But let's go back to the simplest case of lower p in interactive spec: > > What is easier to read/grasp > > (setq counter (or arg 1) > > or > > (setq counter (prefix-numeric-value arg)) Or, alternatively, (defun foo (counter) (interactive "p") ... ) (But of course, only if I have understood that correctly.) But as to your question: Of course your first suggestion is easier to grasp. But IIHUC, one would normally do it the way I have just sketched, and the idea of the "numeric prefix arg" was probably to supply an easy (i.e. short) way to use the prefix arg as a repeat counter. And if my example is correct, that solution isn't that bad. BTW, I have just understood another interesting detail: That there ALWAYS is a prefix arg, even if the user does not supply one, and you do not have to say (defun foo (&optional counter) (interactive "p") ... ) in the specific case where your optional arg is the prefix arg. That, arguably, also adds idiosyncrasy. > IOW: in favor of avoiding these complex, tricky things. Let's have the > code as explicit as possible. I totally agree, but as Eli has pointed out, Elisp was designed the way it was designed a long while back. I guess prefix args have been around almost since the very beginnings. Changing something about very fundamental things like that would mean having to change A LOT OF very fundamental code, without breaking anything. The question then would simply be: Who is up for this job? In other words, even though I like Emacs a lot, I think it is only fair to call Elisp idiosyncratic in some ways. But if it is worth fixing these, I think, is simply what Eli might call a question for a rainy day. I presume that the things that seem so idiosyncratic or somewhat obscure about Elisp (e.g. not only prefix args, but also the way lists are constructed, the reason why there are several kinds of sequences, obarrays) were not deliberately designed to be hard to understand (or to make Emacs privy to the initiated only), but that all had a lot to do with the technical limitations at the time. (Meaning there was perhaps not even a real alternative.) So now they are there, and changing them now would have very different consequences than deciding on a feature when you design a language anew has. (FWIW, I think this is precisely the reason why Larry Wall decided to break compatibility between Perl 5 and Perl 6, making Perl 6 simply a new language. Accidently, one of the design goals of Perl 6 was: being more intuitive than Perl 5.) On the other hand, when I read the node "Command Loop -> Prefix Command Arguments" in the Elisp Manual, I wonder how anyone CANNOT be confused about prefix args, because this node starts out with the unfortunate sentence: Most Emacs commands can use a "prefix argument", a number specified before the command itself. If I am not mistaken, this promotes precisely the misunderstanding that I had fallen prey to. In contrast, other unintuitive features of Elisp are quite well explained in the manual. (List construction -- the cons cell stuff -- and sequences are two things I remember understanding quite readily from reading it, and in both cases it would never have occurred to me to intuitively assume they worked like that.) Maybe it would be a good idea if somebody simply rewrote some of the /documentation/ on prefix args, such that the innocent, naive user understands the point of the two representations? Because that is something that can be easily rewritten without breaking any code. I'll volunteer for the job if somebody checks! -- Florian von Savigny Melanchthonstr. 41 33615 Bielefeld ^ permalink raw reply [flat|nested] 31+ messages in thread
* RE: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-06 13:27 ` Florian v. Savigny @ 2016-09-06 15:22 ` Drew Adams 0 siblings, 0 replies; 31+ messages in thread From: Drew Adams @ 2016-09-06 15:22 UTC (permalink / raw) To: florian, help-gnu-emacs > > IIUC `prefix-numeric-value' is a more complex thing than providing a > > repeat counter - which it does for lower p. > > I thought I had understood that > (interactive (list (prefix-numeric-value current-prefix-arg))) > was exactly the same as > (interactive "p") It is. You understand correctly. > Or isn't it? Then I am really confused. (But a test I just ran seems > to confirm that it is.) +1 for testing. > > But let's go back to the simplest case of lower p in interactive spec: > > What is easier to read/grasp > > (setq counter (or arg 1)) or (setq counter (prefix-numeric-value arg)) > > Or, alternatively, (defun foo (counter) (interactive "p") ...) > > But IIHUC, one would normally do it the way I have just sketched, and > the idea of the "numeric prefix arg" was probably to supply an easy > (i.e. short) way to use the prefix arg as a repeat counter. And if my > example is correct, that solution isn't that bad. > > BTW, I have just understood another interesting detail: That there > ALWAYS is a prefix arg, even if the user does not supply one, and you > do not have to say (defun foo (&optional counter) (interactive "p") ... ) > in the specific case where your optional arg is the prefix arg. Correct. Similarly for "P" (raw prefix arg), in which case the value is nil if a user provided no prefix arg. The point of &optional is for Lisp code. With &optional you can use (foo); without &optional you must use (foo nil) to get the same effect. (You can also use (foo 1) if "p" is the `interactive' arg.) Most functional (or nearly functional) languages do not allow for an arbitrary number of arguments. Instead, for the same behavior as &rest, a function just accepts a list argument (in effect, an explicit list of arguments). Not a big difference, really. Admittedly, the use of &optional and &rest arguments can be surprising, and hence perhaps confusing at first. > That, arguably, also adds idiosyncrasy. I don't think this has anything to do with a prefix argument. It's about &optional. If you do not use &optional then the argument is required. If you use &optional it defaults to nil. That's all. > > IOW: in favor of avoiding these complex, tricky things. > > Let's have the code as explicit as possible. Whatever that means. Pretty general/vague. > I totally agree, but as Eli has pointed out, Elisp was designed the > way it was designed a long while back. I guess prefix args have been > around almost since the very beginnings. Changing something about very > fundamental things like that would mean having to change A LOT OF very > fundamental code, without breaking anything. The question then would > simply be: Who is up for this job? I don't think that was Eli's point. I think his point was (and at least it is my point) that the design is a good one. It is preferable to anything that's been suggested here and now. > In other words, even though I like Emacs a lot, I think it is only > fair to call Elisp idiosyncratic in some ways. What do you mean by idiosyncratic, here? The fact that Elisp has some features that didn't know about or might not have dreamed up yourself? Emacs is different from other editors and UIs in many ways. Does that make it idiosyncratic? Sure. "Idiosyncratic" just means individual, single, particular to the individual. Anything with original features is individual, a "special snowflake". The same is true of Elisp - or any Lisp: it is not what many people are used to in a programming language. If you think of "idiosyncratic" as "odd", then consider that your (one's) notion of "odd" has a lot to do with what you are used to. If you are not used to recursion, anonymous functions, functional-style, structural macros, etc. then Lisp is a very odd animal. If you are more used to a language like Lisp, SQL, or Haskell then Fortran is a very odd animal. > But if it is worth fixing these, I think, is simply what Eli > might call a question for a rainy day. I didn't see Eli suggesting that there was something here that would benefit from "fixing" or "improving". But perhaps I just missed that. In any case, I don't see such benefit. There has been some hand-waving about "idiosyncrasy", but that doesn't hold much water. > I presume that the things that seem so idiosyncratic or somewhat > obscure about Elisp (e.g. not only prefix args, but also the way lists > are constructed, the reason why there are several kinds of sequences, > obarrays) were not deliberately designed to be hard to understand (or > to make Emacs privy to the initiated only), but that all had a lot to > do with the technical limitations at the time. No. But it's not clear just what you have in mind. Very few such things are limited by the specific design/implementation of Elisp. You will find them (but not prefix args, which have to do with commands) in other Lisps as well. > (Meaning there was perhaps not even a real alternative.) Don't assume so. But again, it's not clear just what you're referring to. > So now they are there, and changing them now would have very > different consequences than deciding on a feature when you > design a language anew has. Be specific about which features you are talking about, please. Sure, Emacs and Emacs Lisp have a fair amount of baggage - vestigial thingies - for hysterical raisins. But my impression is that the things that you have mentioned so far, and find odd, are not among them. They are _not_ just a bunch of vestiges that users would love to get rid of but which would require a lot of work to do. There are such things in the Emacs implementation, no doubt. But I don't see any such having been brought up in this thread. Don't fall into the trap of assuming that just because either: 1) Something is new to you, or 2) Something has been around for a long time in Emacs, and is different from what you see elsewhere, that that something is just an unfortunate vestige that Emacs users and developers would love to get rid of if it were easy to do so. More likely, it is a fine feature that you might do well to learn more about. The Emacs prefix argument is a case in point. Or it might just be a so-so choice that has little positive or negative consequence - nothing special, nothing awful. > (FWIW, I think this is precisely the reason why Larry Wall decided to > break compatibility between Perl 5 and Perl 6, making Perl 6 simply a > new language. Accidently, one of the design goals of Perl 6 was: being > more intuitive than Perl 5.) Getting too vague. > On the other hand, when I read the node "Command Loop -> Prefix > Command Arguments" in the Elisp Manual, I wonder how anyone CANNOT be > confused about prefix args, because this node starts out with the > unfortunate sentence: > > Most Emacs commands can use a "prefix argument", a number > specified before the command itself. > > If I am not mistaken, this promotes precisely the misunderstanding > that I had fallen prey to. The presentation in the manual stresses the numeric prefix arg a bit too much, for my taste. A first reading can give the impression that that's all there is to it. The Elisp manual does not have this problem (IMO). But if you have concrete suggestions for the manuals, consider offering them via `M-x report-emacs-bug'. Sometimes Emacs Dev will agree with your suggested change. Sometimes you will learn that the current text is in fact better than what you thought. And sometimes you will agree to disagree. ("You win some; you lose some; and some are rained out.") > In contrast, other unintuitive features of Elisp It's not about intuition (ever). It's about something new. Or sometimes it's about something cumbersome or inconvenient. > are quite well explained in the manual. (List construction -- > the cons cell stuff -- and sequences are two things I remember > understanding quite readily from reading it, and in both cases > it would never have occurred to me to intuitively assume they > worked like that.) > > Maybe it would be a good idea if somebody simply rewrote some of the > /documentation/ on prefix args, such that the innocent, naive user > understands the point of the two representations? Because that is > something that can be easily rewritten without breaking any code. > > I'll volunteer for the job if somebody checks! Please do! `M-x report-emacs-bug'. You can suggest alternative text to use or any other changes you see fit. You can even provide doc patches. Suggestions are always welcome. A report need not propose a solution (alternative text). Just letting Emacs developers know that you found a particular passage unclear can help. And if you can say why, so much the better. ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-06 11:27 ` Andreas Röhler 2016-09-06 13:27 ` Florian v. Savigny @ 2016-09-06 14:20 ` Kaushal Modi 2016-09-06 16:44 ` Andreas Röhler 2016-09-07 23:11 ` Charles Millar 1 sibling, 2 replies; 31+ messages in thread From: Kaushal Modi @ 2016-09-06 14:20 UTC (permalink / raw) To: Andreas Röhler, help-gnu-emacs On Tue, Sep 6, 2016, 7:22 AM Andreas Röhler <andreas.roehler@easy-emacs.de> wrote: > But let's go back to the simplest case of lower p in interactive spec: > > What is easier to read/grasp > > (setq counter (or arg 1) > > or > > (setq counter (prefix-numeric-value arg)) > > IOW: in favor of avoiding these complex, tricky things. Let's have the > code as explicit as possible. > Those 2 forms are not 100℅ equivalent. The equivalence goes only as far as setting the default value of counter. If the user used (interactive "p"), counter need to be set to 4 regardless of whether the user used "C-4" as prefix or "C-u". In the former case, arg would be "4", but in the latter case, it would be "(4)", I.e. a list, not a number. Your simpler representation would not take care of the C-u case. If the counter variable is used where a numeric arg is strictly required, you will get an error. Here, prefix-numeric-value returns "4" when arg is "(4)". > -- Kaushal Modi ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-06 14:20 ` Kaushal Modi @ 2016-09-06 16:44 ` Andreas Röhler 2016-09-06 16:41 ` Kaushal Modi 2016-09-07 23:11 ` Charles Millar 1 sibling, 1 reply; 31+ messages in thread From: Andreas Röhler @ 2016-09-06 16:44 UTC (permalink / raw) To: Kaushal Modi, help-gnu-emacs On 06.09.2016 16:20, Kaushal Modi wrote: > On Tue, Sep 6, 2016, 7:22 AM Andreas Röhler > <andreas.roehler@easy-emacs.de <mailto:andreas.roehler@easy-emacs.de>> > wrote: > > But let's go back to the simplest case of lower p in interactive spec: > > What is easier to read/grasp > > (setq counter (or arg 1) > > or > > (setq counter (prefix-numeric-value arg)) > > IOW: in favor of avoiding these complex, tricky things. Let's have the > code as explicit as possible. > > > Those 2 forms are not 100℅ equivalent. The equivalence goes only as > far as setting the default value of counter. > > If the user used (interactive "p"), counter need to be set to 4 > regardless of whether the user used "C-4" as prefix or "C-u". In the > former case, arg would be "4", but in the latter case, it would be > "(4)", I.e. a list, not a number. Not sure IIUC (defun whatarg-p (arg) (interactive "p") (message "%s" arg)) Called with simply C-u without numeric argument gives me "4" (4) would be the result with uppercase P > Your simpler representation would not take care of the C-u case. If > the counter variable is used where a numeric arg is strictly required, > you will get an error. Here, prefix-numeric-value returns "4" when arg > is "(4)". > > -- > > Kaushal Modi > ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-06 16:44 ` Andreas Röhler @ 2016-09-06 16:41 ` Kaushal Modi 0 siblings, 0 replies; 31+ messages in thread From: Kaushal Modi @ 2016-09-06 16:41 UTC (permalink / raw) To: Andreas Röhler, help-gnu-emacs Ah! So you are suggesting to use the lowercase (interactive "p") AND (setq counter (or arg 1)) ! I thought you were providing an alternative to not having to use the lowercase p interactive form. On Tue, Sep 6, 2016 at 12:37 PM Andreas Röhler < andreas.roehler@easy-emacs.de> wrote: > Not sure IIUC > > (defun whatarg-p (arg) > (interactive "p") > (message "%s" arg)) > > Called with simply C-u without numeric argument gives me "4" > > (4) would be the result with uppercase P > -- Kaushal Modi ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-06 14:20 ` Kaushal Modi 2016-09-06 16:44 ` Andreas Röhler @ 2016-09-07 23:11 ` Charles Millar 2016-09-08 13:10 ` Kaushal Modi 2016-09-08 15:40 ` Drew Adams 1 sibling, 2 replies; 31+ messages in thread From: Charles Millar @ 2016-09-07 23:11 UTC (permalink / raw) To: help-gnu-emacs On 09/06/2016 10:20 AM, Kaushal Modi wrote: > On Tue, Sep 6, 2016, 7:22 AM Andreas Röhler <andreas.roehler@easy-emacs.de> > wrote: > >> But let's go back to the simplest case of lower p in interactive spec: >> >> What is easier to read/grasp >> >> (setq counter (or arg 1) >> >> or >> >> (setq counter (prefix-numeric-value arg)) >> >> IOW: in favor of avoiding these complex, tricky things. Let's have the >> code as explicit as possible. >> > Those 2 forms are not 100℅ equivalent. The equivalence goes only as far as > setting the default value of counter. > > If the user used (interactive "p"), counter need to be set to 4 regardless > of whether the user used "C-4" as prefix or "C-u". In the former case, arg > would be "4", but in the latter case, it would be "(4)", I.e. a list, not a > number. Your simpler representation would not take care of the C-u case. If > the counter variable is used where a numeric arg is strictly required, you > will get an error. Here, prefix-numeric-value returns "4" when arg is > "(4)". > >> -- > I have read this thread as well as the other suggested readings. If the purpose of either p or P is to pass arguments, I do not understand the rationale of allowing C-u when using the interactive upper case P. As noted above, It returns an integer as the only element in a list, which if evaluated returns an error. Is there a use for this? Such as you may want an error? Charlie Millar ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-07 23:11 ` Charles Millar @ 2016-09-08 13:10 ` Kaushal Modi 2016-09-08 14:42 ` Charles Millar 2016-09-08 15:40 ` Drew Adams 1 sibling, 1 reply; 31+ messages in thread From: Kaushal Modi @ 2016-09-08 13:10 UTC (permalink / raw) To: Charles Millar, help-gnu-emacs On Wed, Sep 7, 2016 at 10:41 PM Charles Millar <millarc@verizon.net> wrote: > I have read this thread as well as the other suggested readings. > If the > purpose of either p or P is to pass arguments, I do not understand the > rationale of allowing C-u when using the interactive upper case P. That's useful if the user wants the function to behave different based on if the arg is a list or not. > As > noted above, It returns an integer as the only element in a list, which > if evaluated returns an error. If the arg is a list (C-u), you have to treat it as a list.. e.g. use (car arg). > Is there a use for this? It's up to the user on how they want to treat different arg values. > Such as you may > want an error? Here's a dummy example: (defun foo (arg) (interactive "P") (message (concat "Arg is " (cond ((null arg) "nil") ((listp arg) (format "a list with element %d" (car arg))) (t (format "a number %d" arg)))))) (global-set-key (kbd "C-c '") #'foo)'''' After evaluating the above, do - C-c ' - C-0 C-c ' or M-0 C-c ' - C-1 C-c ' or M-1 C-c ' - .. - C-u C-c ' - C-4 C-c ' or M-4 C-c ' - C-u C-u C-c ' - C-1 C-6 C-c ' or M-1 M-6 C-c ' If the user wishes, they can make the foo function behave differently for each of the above bullets. So it eventually boils down to what the user wants.. do they want the default arg to be nil or 1, do they want to support C-u and C-4 args in different manner, etc. Based on that, they can choose to use the "p" or "P" version of interactive. -- Kaushal Modi ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-08 13:10 ` Kaushal Modi @ 2016-09-08 14:42 ` Charles Millar 0 siblings, 0 replies; 31+ messages in thread From: Charles Millar @ 2016-09-08 14:42 UTC (permalink / raw) To: Kaushal Modi, help-gnu-emacs On 09/08/2016 09:10 AM, Kaushal Modi wrote: > On Wed, Sep 7, 2016 at 10:41 PM Charles Millar <millarc@verizon.net > <mailto:millarc@verizon.net>> wrote: > > I have read this thread as well as the other suggested readings. > > If the > purpose of either p or P is to pass arguments, I do not understand the > rationale of allowing C-u when using the interactive upper case P. > > > That's useful if the user wants the function to behave different based > on if the arg is a list or not. > > As > noted above, It returns an integer as the only element in a list, > which > if evaluated returns an error. > > > If the arg is a list (C-u), you have to treat it as a list.. e.g. use > (car arg). > > Is there a use for this? > > > It's up to the user on how they want to treat different arg values. > > Such as you may > want an error? > > > Here's a dummy example: > > (defun foo (arg) > (interactive "P") > (message (concat "Arg is " > (cond > ((null arg) > "nil") > ((listp arg) > (format "a list with element %d" (car arg))) > (t > (format "a number %d" arg)))))) > (global-set-key (kbd "C-c '") #'foo)'''' > > > After evaluating the above, do > > - C-c ' > - C-0 C-c ' or M-0 C-c ' > - C-1 C-c ' or M-1 C-c ' > - .. > - C-u C-c ' > - C-4 C-c ' or M-4 C-c ' > - C-u C-u C-c ' > - C-1 C-6 C-c ' or M-1 M-6 C-c ' > > If the user wishes, they can make the foo function behave differently > for each of the above bullets. > > So it eventually boils down to what the user wants.. do they want the > default arg to be nil or 1, do they want to support C-u and C-4 args > in different manner, etc. Based on that, they can choose to use the > "p" or "P" version of interactive. > -- Thank you, Kaushal! I suspect that the following has been said many times on this and other lists - "An example, as is a picture, is worth a 1000 words." Charlie Millar ^ permalink raw reply [flat|nested] 31+ messages in thread
* RE: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-07 23:11 ` Charles Millar 2016-09-08 13:10 ` Kaushal Modi @ 2016-09-08 15:40 ` Drew Adams 1 sibling, 0 replies; 31+ messages in thread From: Drew Adams @ 2016-09-08 15:40 UTC (permalink / raw) To: Charles Millar, help-gnu-emacs > I have read this thread as well as the other suggested readings. If the > purpose of either p or P is to pass arguments, I do not understand the > rationale of allowing C-u when using the interactive upper case P. As > noted above, It returns an integer as the only element in a list, which > if evaluated returns an error. Is there a use for this? Such as you may > want an error? Sorry, but I don't understand your question. What do you mean by "allowing C-u when using the interactive upper case P"? `C-u' with (interactive "P") does return `(4)' as the value of the argument. But why do you ask about evaluating that list (value)? Emacs Lisp uses strict evaluation of arguments to functions: all args are evaluated before evaluation of the function body. `(4)' is the "evaluated" value of the raw prefix argument - the function body does not normally invoke `eval' on that to evaluate it again (which would raise an error). Maybe try to clarify your question. Consider showing an example. ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-05 19:02 ` Eli Zaretskii 2016-09-06 7:10 ` tomas @ 2016-09-06 7:22 ` Andreas Röhler 1 sibling, 0 replies; 31+ messages in thread From: Andreas Röhler @ 2016-09-06 7:22 UTC (permalink / raw) To: help-gnu-emacs On 05.09.2016 21:02, Eli Zaretskii wrote: >> Cc: Eli Zaretskii <eliz@gnu.org> >> From: Andreas Röhler <andreas.roehler@online.de> >> Date: Mon, 5 Sep 2016 20:41:22 +0200 >> >> Leaving out the argument with uppercased P, it sends nil --correct-- >> whose numeric value is considered 1 again. >> >> Understand it might be considered a feature, but think the caused >> inconsistency weights in more. > So you also disagree with nil meaning "the default value", do you? > Because, according to you, nil cannot possibly stand for any value but > zero, At least if something supposed the a "numeric argument". Sure, that might be translated. But than that default should be mentioned when the form is introduced. > without risking to be "inconsistent", is that right? > > But if you do accept that nil can stand for the default value, why > cannot you accept that in the case of repeat count it stands for 1, > i.e. that 1 is the default value in this context? > I can accept that and live with it. Just thought current state is not the best we can have. ^ permalink raw reply [flat|nested] 31+ messages in thread
* RE: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-05 7:16 ` Andreas Röhler 2016-09-05 14:56 ` Eli Zaretskii @ 2016-09-05 17:04 ` Drew Adams 2016-09-05 21:39 ` Florian v. Savigny [not found] ` <<877faqvxfp.fsf@bertrandrussell.Speedport_W_723V_1_40_000> 1 sibling, 2 replies; 31+ messages in thread From: Drew Adams @ 2016-09-05 17:04 UTC (permalink / raw) To: Andreas Röhler, help-gnu-emacs > The ideosyncrasy: it yields the same value for arg = 1 as if no arg were > given Idiosyncrasy? That's one way to look at it, I suppose. Similarly: `C-u' and `M-4' have numeric prefix-arg value 4; and `M--' and `C-u - 1' have numeric value -1. But they have different raw prefix-arg values. Idiosyncratic? If you like. Bothersome? Bad? Ugly? Not at all. There is simply a _mapping_ from raw prefix-arg values to numeric prefix-arg values. That mapping is realized by function `prefix-numeric-value'. There's really nothing mysterious or idiosyncratic about the behavior. It's just something to learn. Raw prefix arg != numeric prefix arg. End of story. And whether or not a user explicitly provides a prefix arg, there is ALWAYS a numeric prefix-arg value (default = 1). This is really one of the first things that someone writing a command learns. It is NOT something that someone who uses a command needs to learn. But if a particular command has behavior that is different for different kinds of prefix arg then of course the command doc needs to describe the behavior. > Regardless of its purpose - such coding style should not > be encouraged. What does that mean? What style should be discouraged, and why? Just because a feature exists that allows code to distinguish various user behaviors wrt using a prefix arg, that does not mean that commands should NOT make use of that feature. And it does not mean that they MUST make use of it. Clearly, the _default_ behavior of a command, i.e., its behavior with no prefix arg provided by the user, should be the typical behavior. That does not mean that a command should not offer alternative behaviors, which make use of a prefix argument, provided those alternative behaviors are clearly documented. > It would be easy and consistent to write (or arg (setq arg 1)) What would be the point of writing that? That's essentially `(prefix-numeric-value arg)', except that if ARG is non-nil then you won't necessarily get a number; you'll get a number OR a cons OR the symbol `-'. Perhaps you were proposing a redesign, where there would be NO raw prefix arg, and the numeric value would try to do double-duty, to both be numeric and provide a way to test whether a prefix arg was actually provided by the user? There are good reasons why Emacs has a raw prefix arg, if that is your underlying question. For one thing, it lets code know how many `C-u's a user used: 0, 1, 2, 3... And that's handy because `C-u C-u' is quick to type. Just distinguishing zero, one, and two `C-u's gives a command 3 possible behaviors - no need to compare numeric values etc. It's really not a big deal. It's a flexible feature and is easy to learn. Admittedly (like much in Emacs), if you have not yet learned it, and you try to write a command that takes advantage of a prefix arg, then you might be surprised to learn it. Your surprise should be a welcome one, as you now know what you can do with it. ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-05 17:04 ` Drew Adams @ 2016-09-05 21:39 ` Florian v. Savigny [not found] ` <<877faqvxfp.fsf@bertrandrussell.Speedport_W_723V_1_40_000> 1 sibling, 0 replies; 31+ messages in thread From: Florian v. Savigny @ 2016-09-05 21:39 UTC (permalink / raw) To: help-gnu-emacs > This is really one of the first things that someone writing > a command learns. Oops. I must confess this did not happen in my case. I have written commands in Elisp for about 15 years, and I although I was soon familiar with there somehow being a "raw" prefix arg (meaning I often read this term in passing), I nevertheless always thought C-u was simply a way of passing a command a number. (I did not even know that you can also pass prefix commands typing M-..) > It's really not a big deal. It's a flexible feature and is > easy to learn. Admittedly (like much in Emacs), if you have > not yet learned it, and you try to write a command that > takes advantage of a prefix arg, then you might be surprised > to learn it. Your surprise should be a welcome one, as you > now know what you can do with it. Absolutely, at least now. Your post has been a very enlightening lecture indeed, as have the other explanatory posts. (I am wondering why I never grasped it from the Elisp Manual, but I guess because you have stated the whys and wherefores, it is much easier for me to store in memory somewhere.) Thanks very much to you all! -- Florian von Savigny Melanchthonstr. 41 33615 Bielefeld ^ permalink raw reply [flat|nested] 31+ messages in thread
[parent not found: <<877faqvxfp.fsf@bertrandrussell.Speedport_W_723V_1_40_000>]
* RE: Rationale behind conversion of a nil prefix arg to numeric 1 [not found] ` <<877faqvxfp.fsf@bertrandrussell.Speedport_W_723V_1_40_000> @ 2016-09-05 23:32 ` Drew Adams 2016-09-06 3:45 ` B.V. Raghav 0 siblings, 1 reply; 31+ messages in thread From: Drew Adams @ 2016-09-05 23:32 UTC (permalink / raw) To: Florian v. Savigny, help-gnu-emacs > > This is really one of the first things that someone writing > > a command learns. > > Oops. I must confess this did not happen in my case. I should not have been so black-&-white in saying that. I really meant that only in the context of writing commands that use a prefix arg, and in particular, commands where not explicitly providing a prefix arg has a different behavior from providing a prefix arg of 1. IOW, it only matters if you in fact care about whether the user provided a prefix arg. If you are writing a command where the prefix arg is used only as the number of times to repeat the behavior then you will likely not be aware of, or see the point of, a raw prefix argument. > I have written > commands in Elisp for about 15 years, and I although I was soon > familiar with there somehow being a "raw" prefix arg (meaning I often > read this term in passing), I nevertheless always thought C-u was > simply a way of passing a command a number. (I did not even know that > you can also pass prefix commands typing M-..) I'm sure your experience is not unusual. See above: if you never write a command that cares whether the user provided a prefix arg then you are not so likely to have learned this. > > It's really not a big deal. It's a flexible feature and is > > easy to learn. Admittedly (like much in Emacs), if you have > > not yet learned it, and you try to write a command that > > takes advantage of a prefix arg, then you might be surprised > > to learn it. Your surprise should be a welcome one, as you > > now know what you can do with it. > > Absolutely, at least now. Your post has been a very enlightening > lecture indeed, as have the other explanatory posts. (I am wondering > why I never grasped it from the Elisp Manual, but I guess because you > have stated the whys and wherefores, it is much easier for me to store > in memory somewhere.) It's often the case that the same bit of info really registers only after we've come into contact with the particular problem (use case) that it was put there to address. > Thanks very much to you all! Thanks for posing the question, as I'm sure you are not the only one for whom the question and the answer are helpful. ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-05 23:32 ` Drew Adams @ 2016-09-06 3:45 ` B.V. Raghav 0 siblings, 0 replies; 31+ messages in thread From: B.V. Raghav @ 2016-09-06 3:45 UTC (permalink / raw) To: Drew Adams; +Cc: help-gnu-emacs Drew Adams <drew.adams@oracle.com> writes: > Thanks for posing the question, as I'm sure you are not the > only one for whom the question and the answer are helpful. > Spot right... I already bookmarked it and added it to my notes for revision later someday.. Thanks, r -- (B.V. Raghav) ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-04 14:23 ` Eli Zaretskii 2016-09-04 17:11 ` Andreas Röhler @ 2016-09-04 22:53 ` Florian v. Savigny [not found] ` <<87d1kjjmys.fsf@bertrandrussell.Speedport_W_723V_1_40_000> 2 siblings, 0 replies; 31+ messages in thread From: Florian v. Savigny @ 2016-09-04 22:53 UTC (permalink / raw) To: help-gnu-emacs > Yes. Most commands use the argument as a repeat count, so having it > default to one makes perfect sense. Ahh! You mean, like, C-u 80 - conveniently draws a line across the screen. Yes, that makes it understandable indeed. Sounds like the prefix argument was more or less conceived as a repeat count. Thanks a lot, Eli! Florian -- Florian von Savigny Melanchthonstr. 41 33615 Bielefeld ^ permalink raw reply [flat|nested] 31+ messages in thread
[parent not found: <<87d1kjjmys.fsf@bertrandrussell.Speedport_W_723V_1_40_000>]
* RE: Rationale behind conversion of a nil prefix arg to numeric 1 [not found] ` <<87d1kjjmys.fsf@bertrandrussell.Speedport_W_723V_1_40_000> @ 2016-09-05 0:52 ` Drew Adams 0 siblings, 0 replies; 31+ messages in thread From: Drew Adams @ 2016-09-05 0:52 UTC (permalink / raw) To: Florian v. Savigny, help-gnu-emacs > > Yes. Most commands use the argument as a repeat count, so having it > > default to one makes perfect sense. > > Ahh! You mean, like, C-u 80 > > conveniently draws a line across the screen. Yes, that makes it > understandable indeed. Sounds like the prefix argument was more or ^ numeric > less conceived as a repeat count. Yes. It's a feature. There are several forms a raw prefix argument can take, and one `prefix-numeric-value' of it, whatever the form. The latter is called the numeric prefix argument. A command can test the numeric value (an integer) and do different things, depending on the value. A command can also test the raw prefix argument: test for its presence (non-nil) and even test for its specific non-nil form. See the Emacs manual, node `Arguments' http://www.gnu.org/software/emacs/manual/html_node/emacs/Arguments.html And see the Elisp manual, nodes: * `Prefix Command Arguments' http://www.gnu.org/software/emacs/manual/html_node/elisp/Prefix-Command-Arguments.html * `Interactive Codes' (`p' and `P') http://www.gnu.org/software/emacs/manual/html_node/elisp/Interactive-Codes.html ^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: Rationale behind conversion of a nil prefix arg to numeric 1 2016-09-04 12:23 Rationale behind conversion of a nil prefix arg to numeric 1 Florian v. Savigny 2016-09-04 14:23 ` Eli Zaretskii @ 2016-09-15 12:47 ` Thien-Thi Nguyen 1 sibling, 0 replies; 31+ messages in thread From: Thien-Thi Nguyen @ 2016-09-15 12:47 UTC (permalink / raw) To: Florian v. Savigny; +Cc: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 584 bytes --] () florian@fsavigny.de (Florian v. Savigny) () Sun, 04 Sep 2016 14:23:35 +0200 but I am still wondering about the rationale of representing nil as the number one. When there is no question, the question is nil. Emacs gives you a (singular) hand, anyway -- what a pal! :-D -- Thien-Thi Nguyen ----------------------------------------------- (defun responsep (type via) (case type (technical (eq 'mailing-list via)) ...)) 748E A0E8 1CB8 A748 9BFA --------------------------------------- 6CE4 6703 2224 4C80 7502 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 31+ messages in thread
end of thread, other threads:[~2016-09-15 12:47 UTC | newest] Thread overview: 31+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-09-04 12:23 Rationale behind conversion of a nil prefix arg to numeric 1 Florian v. Savigny 2016-09-04 14:23 ` Eli Zaretskii 2016-09-04 17:11 ` Andreas Röhler 2016-09-04 18:33 ` Eli Zaretskii 2016-09-05 7:16 ` Andreas Röhler 2016-09-05 14:56 ` Eli Zaretskii 2016-09-05 15:22 ` Kaushal Modi 2016-09-05 16:32 ` Drew Adams 2016-09-05 18:41 ` Andreas Röhler 2016-09-05 19:02 ` Eli Zaretskii 2016-09-06 7:10 ` tomas 2016-09-06 9:45 ` Florian v. Savigny 2016-09-06 10:27 ` tomas 2016-09-06 11:27 ` Andreas Röhler 2016-09-06 13:27 ` Florian v. Savigny 2016-09-06 15:22 ` Drew Adams 2016-09-06 14:20 ` Kaushal Modi 2016-09-06 16:44 ` Andreas Röhler 2016-09-06 16:41 ` Kaushal Modi 2016-09-07 23:11 ` Charles Millar 2016-09-08 13:10 ` Kaushal Modi 2016-09-08 14:42 ` Charles Millar 2016-09-08 15:40 ` Drew Adams 2016-09-06 7:22 ` Andreas Röhler 2016-09-05 17:04 ` Drew Adams 2016-09-05 21:39 ` Florian v. Savigny [not found] ` <<877faqvxfp.fsf@bertrandrussell.Speedport_W_723V_1_40_000> 2016-09-05 23:32 ` Drew Adams 2016-09-06 3:45 ` B.V. Raghav 2016-09-04 22:53 ` Florian v. Savigny [not found] ` <<87d1kjjmys.fsf@bertrandrussell.Speedport_W_723V_1_40_000> 2016-09-05 0:52 ` Drew Adams 2016-09-15 12:47 ` Thien-Thi Nguyen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).