* How to make M-x TAB not work on (interactive) declaration? @ 2023-01-07 20:53 Jean Louis 2023-01-07 21:11 ` Ruijie Yu via Users list for the GNU Emacs text editor ` (2 more replies) 0 siblings, 3 replies; 149+ messages in thread From: Jean Louis @ 2023-01-07 20:53 UTC (permalink / raw) To: Help GNU Emacs Reference: (describe-function 'interactive) If MODES is present, it should be a list of mode names (symbols) that this command is applicable for. The main effect of this is that ‘M-x TAB’ (by default) won’t list this command if the current buffer’s mode doesn’t match the list. That is, if either the major mode isn’t derived from them, or (when it’s a minor mode) the mode isn’t in effect. For this example here I can still see it in M-x TAB expansion in any mode. (defun my-function () (interactive nil '(text-mode)) (message "Hello")) And I expect not to see it. What am I doing wrong? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-07 20:53 How to make M-x TAB not work on (interactive) declaration? Jean Louis @ 2023-01-07 21:11 ` Ruijie Yu via Users list for the GNU Emacs text editor 2023-01-07 23:40 ` Jean Louis 2023-01-08 6:06 ` Eli Zaretskii 2023-01-08 8:34 ` Tassilo Horn 2 siblings, 1 reply; 149+ messages in thread From: Ruijie Yu via Users list for the GNU Emacs text editor @ 2023-01-07 21:11 UTC (permalink / raw) To: Jean Louis; +Cc: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > Reference: > (describe-function 'interactive) > > If MODES is present, it should be a list of mode names (symbols) that > this command is applicable for. The main effect of this is that > ‘M-x TAB’ (by default) won’t list this command if the current buffer’s > mode doesn’t match the list. That is, if either the major mode isn’t > derived from them, or (when it’s a minor mode) the mode isn’t in effect. > > For this example here I can still see it in M-x TAB expansion in any > mode. > > (defun my-function () > (interactive nil '(text-mode)) > (message "Hello")) > > > And I expect not to see it. > > What am I doing wrong? Can confirm on both 29 and 28. Although I think you missed the `&rest' in the argument list, so you would only need to say (interactive nil #'text-mode) In my testing, I tried to define: (defun foo () (interactive nil #'text-mode) 2) Running M-x fo TAB while inside an `ielm' buffer completes the `foo' command, which should not happen according to the quoted documentation. On a slight tangent, I tried to use M-X (M-S-x, `execute-extended-command-for-buffer'), and regardless of what major modes I am in, I cannot find or call the `foo' command. Best, RY ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-07 21:11 ` Ruijie Yu via Users list for the GNU Emacs text editor @ 2023-01-07 23:40 ` Jean Louis 0 siblings, 0 replies; 149+ messages in thread From: Jean Louis @ 2023-01-07 23:40 UTC (permalink / raw) To: Ruijie Yu; +Cc: help-gnu-emacs * Ruijie Yu <ruijie@netyu.xyz> [2023-01-08 00:28]: > > (defun my-function () > > (interactive nil '(text-mode)) > > (message "Hello")) Instead of above, I should do: (defun my-function-1 () (interactive nil 'text-mode 'fundamental-mode) (message "Hello")) But I still see "my-function-1" when using TAB. > Can confirm on both 29 and 28. Although I think you missed the `&rest' > in the argument list, so you would only need to say > > (interactive nil #'text-mode) > > In my testing, I tried to define: > > (defun foo () (interactive nil #'text-mode) 2) > > Running M-x fo TAB while inside an `ielm' buffer completes the `foo' > command, which should not happen according to the quoted documentation. > > On a slight tangent, I tried to use M-X (M-S-x, > `execute-extended-command-for-buffer'), and regardless of what major > modes I am in, I cannot find or call the `foo' command. And I switched to text-mode and M-X does not show me the function. This is inverse and awkward as to what is written in documentation. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-07 20:53 How to make M-x TAB not work on (interactive) declaration? Jean Louis 2023-01-07 21:11 ` Ruijie Yu via Users list for the GNU Emacs text editor @ 2023-01-08 6:06 ` Eli Zaretskii 2023-01-08 6:19 ` Emanuel Berg 2023-01-08 6:21 ` How to make M-x TAB not work on (interactive) declaration? Jean Louis 2023-01-08 8:34 ` Tassilo Horn 2 siblings, 2 replies; 149+ messages in thread From: Eli Zaretskii @ 2023-01-08 6:06 UTC (permalink / raw) To: help-gnu-emacs > Date: Sat, 07 Jan 2023 23:53:48 +0300 > From: Jean Louis <bugs@gnu.support> > > > Reference: > (describe-function 'interactive) > > If MODES is present, it should be a list of mode names (symbols) that > this command is applicable for. The main effect of this is that > ‘M-x TAB’ (by default) won’t list this command if the current buffer’s > mode doesn’t match the list. That is, if either the major mode isn’t > derived from them, or (when it’s a minor mode) the mode isn’t in effect. > > For this example here I can still see it in M-x TAB expansion in any > mode. > > (defun my-function () > (interactive nil '(text-mode)) > (message "Hello")) > > > And I expect not to see it. > > What am I doing wrong? The doc string is wrong: the default is to show all commands. If you want to see only those relevant to MODES, either use M-X (upper-case X) or customize read-extended-command-predicate's value to be the function command-completion-default-include-p. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-08 6:06 ` Eli Zaretskii @ 2023-01-08 6:19 ` Emanuel Berg 2023-01-09 4:49 ` Jean Louis 2023-01-08 6:21 ` How to make M-x TAB not work on (interactive) declaration? Jean Louis 1 sibling, 1 reply; 149+ messages in thread From: Emanuel Berg @ 2023-01-08 6:19 UTC (permalink / raw) To: help-gnu-emacs Eli Zaretskii wrote: >> What am I doing wrong? > > The doc string is wrong Jean, know that you are not actually supposed to _read_ the docstrings! -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-08 6:19 ` Emanuel Berg @ 2023-01-09 4:49 ` Jean Louis 2023-01-09 6:26 ` algorithmic Lisp language (was: Re: How to make M-x TAB not work on (interactive) declaration?) Emanuel Berg 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-09 4:49 UTC (permalink / raw) To: help-gnu-emacs * Emanuel Berg <incal@dataswamp.org> [2023-01-08 21:12]: > Eli Zaretskii wrote: > > >> What am I doing wrong? > > > > The doc string is wrong > > Jean, know that you are not actually supposed to _read_ > the docstrings! ☺️ Do you want to say I am chainik? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* algorithmic Lisp language (was: Re: How to make M-x TAB not work on (interactive) declaration?) 2023-01-09 4:49 ` Jean Louis @ 2023-01-09 6:26 ` Emanuel Berg 2023-01-09 19:30 ` Jean Louis 2023-01-09 19:32 ` Jean Louis 0 siblings, 2 replies; 149+ messages in thread From: Emanuel Berg @ 2023-01-09 6:26 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: >>>> What am I doing wrong? >>> >>> The doc string is wrong >> >> Jean, know that you are not actually supposed to _read_ >> the docstrings! > > ☺️ > > Do you want to say I am chainik? Elisp dlia chainikof - The fun and easy way! I have often thought one should have a minimal Lisp language instead of a maximalist one [we don't have to outlaw the maximalist ones] so that the minimal one would be accessible to anyone instantly, but then one would program not one zillion modules so it would be impossible to know where to start anyway, no, instead one would implement known algorithms in that minimal language - indeed, sounds pretty fun and easy, right? (E.g. Bubblesort [1] or whatever.) Then one would have a superstructure language not of programming code as we are used to it, but of a special notation, actually a new code, but denoting those algorithms and how they would link and combine ... [1] https://en.wikipedia.org/wiki/Bubble_sort -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: algorithmic Lisp language (was: Re: How to make M-x TAB not work on (interactive) declaration?) 2023-01-09 6:26 ` algorithmic Lisp language (was: Re: How to make M-x TAB not work on (interactive) declaration?) Emanuel Berg @ 2023-01-09 19:30 ` Jean Louis 2023-01-09 19:32 ` Jean Louis 1 sibling, 0 replies; 149+ messages in thread From: Jean Louis @ 2023-01-09 19:30 UTC (permalink / raw) To: help-gnu-emacs * Emanuel Berg <incal@dataswamp.org> [2023-01-09 19:28]: > > ☺️ > > > > Do you want to say I am chainik? > > Elisp dlia chainikof - The fun and easy way! From The Jargon File (version 4.4.7, 29 Dec 2003) [jargon]: chainik /chi:'nik/ [Russian, literally ?teapot?] Almost synonymous with muggle. Implies both ignorance and a certain amount of willingness to learn, but does not necessarily imply as little experience or short exposure time as newbie and is not as derogatory as luser. Both a novice user and someone using a system for a long time without any understanding of the internals can be referred to as chainiks. Very widespread term in Russian hackish, often used in an English context by Russian-speaking hackers esp. in Israel (e.g. ?Our new colleague is a complete chainik?). FidoNet discussion groups often had a ?chainik? subsection for newbies and, well, old chainiks (eg. su.asm.chainik, ru.linux.chainik, ru.html.chainik). Public projects often have a chainik mailing list to keep the chainiks off the developers' and experienced users' discussions. Today, the word is slowly slipping into mainstream Russian due to the Russian translation of the popular yellow-black covered ?foobar for dummies? series, which (correctly) uses ? chainik? for ?dummy?, but its frequent (though not excessive) use is still characteristic hacker-speak. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: algorithmic Lisp language (was: Re: How to make M-x TAB not work on (interactive) declaration?) 2023-01-09 6:26 ` algorithmic Lisp language (was: Re: How to make M-x TAB not work on (interactive) declaration?) Emanuel Berg 2023-01-09 19:30 ` Jean Louis @ 2023-01-09 19:32 ` Jean Louis 1 sibling, 0 replies; 149+ messages in thread From: Jean Louis @ 2023-01-09 19:32 UTC (permalink / raw) To: help-gnu-emacs * Emanuel Berg <incal@dataswamp.org> [2023-01-09 19:28]: > I have often thought one should have a minimal > Lisp language instead of a maximalist one [we > don't have to outlaw the maximalist ones] so > that the minimal one would be accessible to > anyone instantly, but then one would program not > one zillion modules so it would be impossible to > know where to start anyway, no, instead one > would implement known algorithms in that minimal > language - indeed, sounds pretty fun and easy, > right? (E.g. Bubblesort [1] or whatever.) > Then one would have a superstructure language > not of programming code as we are used to it, > but of a special notation, actually a new code, > but denoting those algorithms and how they would > link and combine ... Sounds to me as Prolog. From The Collaborative International Dictionary of English v.0.48 [gcide]: PROLOG \PRO"LOG\ (pr[=o]"l[o^]g), n. (Computers) A declarative higher-level programming language in which instructions are written not as explicit procedural data-manipulation commands, but as logical statements. The language has built-in resolution procedures for logical inference. [PJC] -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-08 6:06 ` Eli Zaretskii 2023-01-08 6:19 ` Emanuel Berg @ 2023-01-08 6:21 ` Jean Louis 2023-01-08 6:32 ` Emanuel Berg 2023-01-08 10:38 ` Eli Zaretskii 1 sibling, 2 replies; 149+ messages in thread From: Jean Louis @ 2023-01-08 6:21 UTC (permalink / raw) To: Eli Zaretskii; +Cc: help-gnu-emacs * Eli Zaretskii <eliz@gnu.org> [2023-01-08 09:07]: > > And I expect not to see it. > > > > What am I doing wrong? > > The doc string is wrong: the default is to show all commands. If you > want to see only those relevant to MODES, either use M-X (upper-case > X) or customize read-extended-command-predicate's value to be the > function command-completion-default-include-p. Now we know that there is some inconsistency, thanks for confirming it. For this function: (defun my-function () (interactive nil '(text-mode mail-mode)) (message "Hello")) major-mode ➜ mail-mode My default was: (setq read-extended-command-predicate nil) - I can see 90 possible completions with M-X in mail-mode, WITHOUT `my-function' - I can see 9819 possible completions with M-x in mail-mode, WITH `my-function' when I turn it on: (setq read-extended-command-predicate 'command-completion-default-include-p) - I can see 90 possible completions with M-X in mail-mode, WITHOUT `my-function' - I can see 8777 possible completions with M-x in mail-mode, WITHOUT `my-function' Which means that my function cannot be found with recommended settings in mail-mode, so there must be more inconsistencies. I have filed the above as bug, it is best to continue discussion as bug. But in the bug there shall be wording "I can see 8777" just as in here, there was mistake. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-08 6:21 ` How to make M-x TAB not work on (interactive) declaration? Jean Louis @ 2023-01-08 6:32 ` Emanuel Berg 2023-01-08 10:38 ` Eli Zaretskii 1 sibling, 0 replies; 149+ messages in thread From: Emanuel Berg @ 2023-01-08 6:32 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: > I have filed the above as bug, it is best to continue > discussion as bug. Very good work ... -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-08 6:21 ` How to make M-x TAB not work on (interactive) declaration? Jean Louis 2023-01-08 6:32 ` Emanuel Berg @ 2023-01-08 10:38 ` Eli Zaretskii 1 sibling, 0 replies; 149+ messages in thread From: Eli Zaretskii @ 2023-01-08 10:38 UTC (permalink / raw) To: help-gnu-emacs > Date: Sun, 8 Jan 2023 09:21:32 +0300 > From: Jean Louis <bugs@gnu.support> > Cc: help-gnu-emacs@gnu.org > > * Eli Zaretskii <eliz@gnu.org> [2023-01-08 09:07]: > > > And I expect not to see it. > > > > > > What am I doing wrong? > > > > The doc string is wrong: the default is to show all commands. If you > > want to see only those relevant to MODES, either use M-X (upper-case > > X) or customize read-extended-command-predicate's value to be the > > function command-completion-default-include-p. > > Now we know that there is some inconsistency, thanks for confirming > it. > > For this function: > > (defun my-function () > (interactive nil '(text-mode mail-mode)) > (message "Hello")) > > major-mode ➜ mail-mode > > My default was: > (setq read-extended-command-predicate nil) > > - I can see 90 possible completions with M-X in mail-mode, WITHOUT `my-function' > > - I can see 9819 possible completions with M-x in mail-mode, WITH `my-function' > > when I turn it on: > > (setq read-extended-command-predicate 'command-completion-default-include-p) > > - I can see 90 possible completions with M-X in mail-mode, WITHOUT `my-function' > > - I can see 8777 possible completions with M-x in mail-mode, WITHOUT `my-function' > > Which means that my function cannot be found with recommended > settings in mail-mode, so there must be more inconsistencies. > > I have filed the above as bug, it is best to continue discussion as > bug. > > But in the bug there shall be wording "I can see 8777" just as in > here, there was mistake. You reported a bug, so let's continue discussing this there. In general, I believe your expectations were wrong. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-07 20:53 How to make M-x TAB not work on (interactive) declaration? Jean Louis 2023-01-07 21:11 ` Ruijie Yu via Users list for the GNU Emacs text editor 2023-01-08 6:06 ` Eli Zaretskii @ 2023-01-08 8:34 ` Tassilo Horn 2023-01-08 11:01 ` Eli Zaretskii 2023-01-08 21:35 ` Jean Louis 2 siblings, 2 replies; 149+ messages in thread From: Tassilo Horn @ 2023-01-08 8:34 UTC (permalink / raw) To: Jean Louis; +Cc: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: Hi Jean, > Reference: > (describe-function 'interactive) > > If MODES is present, it should be a list of mode names (symbols) that > this command is applicable for. The main effect of this is that ‘M-x > TAB’ (by default) won’t list this command if the current buffer’s mode > doesn’t match the list. That is, if either the major mode isn’t > derived from them, or (when it’s a minor mode) the mode isn’t in > effect. MODES is a &rest argument and the mode symbols shouldn't be quoted, so you use it like so: (defun my-function () (interactive nil text-mode some-other-mode) (message "Hello")) > For this example here I can still see it in M-x TAB expansion in any > mode. You also have to set (setq read-extended-command-predicate #'command-completion-default-include-p) I've added that to my init.el when the feature was built, see the info docs at (info "(emacs) M-x"): --8<---------------cut here---------------start------------->8--- In addition, ‘M-x’ completion can exclude commands that are not relevant to, and generally cannot work with, the current buffer’s major mode (*note Major Modes::) and minor modes (*note Minor Modes::). By default, no commands are excluded, but you can customize the option ‘read-extended-command-predicate’ to exclude those irrelevant commands from completion results. --8<---------------cut here---------------end--------------->8--- You are right that this is feature is probably not documented good enough. It seems `command-completion-default-include-p' isn't documented at all (but customize knows about it) and the `interactive' docstring is missing references to that and `read-extended-command-predicate', too. I'd suggest to write a bug report. Bye, Tassilo ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-08 8:34 ` Tassilo Horn @ 2023-01-08 11:01 ` Eli Zaretskii 2023-01-09 13:29 ` Tassilo Horn 2023-01-08 21:35 ` Jean Louis 1 sibling, 1 reply; 149+ messages in thread From: Eli Zaretskii @ 2023-01-08 11:01 UTC (permalink / raw) To: help-gnu-emacs > From: Tassilo Horn <tsdh@gnu.org> > Cc: help-gnu-emacs@gnu.org > Date: Sun, 08 Jan 2023 09:34:28 +0100 > > You are right that this is feature is probably not documented good > enough. It seems `command-completion-default-include-p' isn't > documented at all (but customize knows about it) and the `interactive' > docstring is missing references to that and > `read-extended-command-predicate', too. I'd suggest to write a bug > report. These deficiencies should be already fixed on the emacs-29 branch. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-08 11:01 ` Eli Zaretskii @ 2023-01-09 13:29 ` Tassilo Horn 0 siblings, 0 replies; 149+ messages in thread From: Tassilo Horn @ 2023-01-09 13:29 UTC (permalink / raw) To: Eli Zaretskii; +Cc: help-gnu-emacs Eli Zaretskii <eliz@gnu.org> writes: >> From: Tassilo Horn <tsdh@gnu.org> >> Cc: help-gnu-emacs@gnu.org >> Date: Sun, 08 Jan 2023 09:34:28 +0100 >> >> You are right that this is feature is probably not documented good >> enough. It seems `command-completion-default-include-p' isn't >> documented at all (but customize knows about it) and the `interactive' >> docstring is missing references to that and >> `read-extended-command-predicate', too. I'd suggest to write a bug >> report. > > These deficiencies should be already fixed on the emacs-29 branch. Yes, LGTM. Thanks, Tassilo ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-08 8:34 ` Tassilo Horn 2023-01-08 11:01 ` Eli Zaretskii @ 2023-01-08 21:35 ` Jean Louis 2023-01-08 22:35 ` [External] : " Drew Adams 1 sibling, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-08 21:35 UTC (permalink / raw) To: Tassilo Horn; +Cc: help-gnu-emacs * Tassilo Horn <tsdh@gnu.org> [2023-01-08 11:46]: > Jean Louis <bugs@gnu.support> writes: > > Hi Jean, > > > Reference: > > (describe-function 'interactive) > > > > If MODES is present, it should be a list of mode names (symbols) that > > this command is applicable for. The main effect of this is that ‘M-x > > TAB’ (by default) won’t list this command if the current buffer’s mode > > doesn’t match the list. That is, if either the major mode isn’t > > derived from them, or (when it’s a minor mode) the mode isn’t in > > effect. > > MODES is a &rest argument and the mode symbols shouldn't be quoted, so > you use it like so: > > (defun my-function () > (interactive nil text-mode some-other-mode) > (message "Hello")) Then is not good to say "it should be a list of mode names". Of course after &rest the argument becomes list, but is not same thing. Thanks, this way I find that function does not appear in other modes. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* RE: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-08 21:35 ` Jean Louis @ 2023-01-08 22:35 ` Drew Adams 2023-01-09 0:24 ` Emanuel Berg 0 siblings, 1 reply; 149+ messages in thread From: Drew Adams @ 2023-01-08 22:35 UTC (permalink / raw) To: Jean Louis, Tassilo Horn; +Cc: help-gnu-emacs@gnu.org > Then is not good to say "it should be a list of > mode names". Of course after &rest the argument > becomes list, but is not same thing. I' sure you know this, but maybe it's worth repeating: Yes and no. Yes, a parameter specified in a function definition is not the same thing as an actual argument in a given application of the function. But no, depending on how "it" is read, it _can_ be said to be the same thing. MODES is a formal parameter in the function definition, but MODES is also the name of a local variable in the function, a variable that's bound, when the function is called, to a list of actual arguments. In a function call, MODES _is_ the list of argument values; that is, the value of variable MODES is that list. (defun foo (a &rest b) (message "A: %S, B: %S" a b)) (foo 1 2 3 4) ==> "A: 1, B: (2 3 4)" This is the definition of an &rest parameter. `&rest MODES' is a formal parameter spec (part of a "lambda list", which is part of a function definition), which corresponds to a list (possibly empty) of actual arguments. Same thing in a lambda expression (definition of an anonymous function). https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node64.html "the lambda-list ... specifies names for the parameters of the function. When the function denoted by the lambda-expression is applied to arguments, the arguments are matched with the parameters specified by the lambda-list." What is this "matching" for &rest? "remaining arguments are made into a list for the &rest parameter" ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-08 22:35 ` [External] : " Drew Adams @ 2023-01-09 0:24 ` Emanuel Berg 2023-01-09 19:47 ` Jean Louis 0 siblings, 1 reply; 149+ messages in thread From: Emanuel Berg @ 2023-01-09 0:24 UTC (permalink / raw) To: help-gnu-emacs Drew Adams wrote: >> Then is not good to say "it should be a list of mode >> names". Of course after &rest the argument becomes list, >> but is not same thing. > > I'm sure you know this, but maybe it's worth repeating: > > Yes and no. Yes, a parameter specified in a function > definition is not the same thing as an actual argument in > a given application of the function. [...] Just don't mention list, say it can be any number of whatever ... (+) ; 0 (*) ; 1 -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-09 0:24 ` Emanuel Berg @ 2023-01-09 19:47 ` Jean Louis 2023-01-10 23:28 ` Emanuel Berg 2023-01-15 20:18 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Rudolf Adamkovič 0 siblings, 2 replies; 149+ messages in thread From: Jean Louis @ 2023-01-09 19:47 UTC (permalink / raw) To: help-gnu-emacs * Emanuel Berg <incal@dataswamp.org> [2023-01-09 19:28]: > (+) ➜ 0 Why? It is wrong. > (*) ➜ 1 Why? It is wrong. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-09 19:47 ` Jean Louis @ 2023-01-10 23:28 ` Emanuel Berg 2023-01-13 6:21 ` (*)->1 Jean Louis 2023-01-15 20:18 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Rudolf Adamkovič 1 sibling, 1 reply; 149+ messages in thread From: Emanuel Berg @ 2023-01-10 23:28 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: >> (+) ; 0 > > Why? It is wrong. > >> (*) ; 1 > > Why? It is wrong. It makes sense in the way that 0 and 1 are the identity elements for addition and multiplication, respectively. -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* (*)->1 2023-01-10 23:28 ` Emanuel Berg @ 2023-01-13 6:21 ` Jean Louis 2023-01-14 12:03 ` (*)->1 Michael Heerdegen 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-13 6:21 UTC (permalink / raw) To: help-gnu-emacs * Emanuel Berg <incal@dataswamp.org> [2023-01-13 03:23]: > Jean Louis wrote: > > >> (+) ; 0 > > > > Why? It is wrong. > > > >> (*) ; 1 > > > > Why? It is wrong. > > It makes sense in the way that 0 and 1 are the identity > elements for addition and multiplication, respectively. I can think of it this way:nn + is function and it follows by nothing which is in this case represented as zero. Nothing is zero, so result is zero. But nothing is not zero that I know, mathematically. Zero at least has some value, while nothing has no value. See here: (list) ➜ nil (list 0) ➜ (0) Thus (+) ➜ 0 without value result should not be zero. If no values where given to addition, no addition has taken place. Value of zero should not get out of nothing. Multiplication is repeated addition. Repeated addition of zero can't be 1. (* 2 3) is equal (+ 3 3) ➜ 6 (* 4 3) is equal (+ 3 3 3 3) ➜ 12 How can then (*) ➜ 1 be equal to (+) ➜ 0 no matter how many times you repeat it? Thus this is wrong: (+ (+) (+) (+) (+) (+) (+) (+) (+)) ➜ 0 One thing we learn here, we can finally express mathematical notation very clearly: for example that 2 + 2 = 4 is expressed as following from now on: (+(+(*)(*))(+(*)(*))) ➜ 4 We can also easily teach children multiplication table every Christmas: (*(+(*))(+(*)(*))) ➜ 2 (*(+(*))(+(*)(*)(*))) ➜ 3 (*(+(*))(+(*)(*)(*)(*))) ➜ 4 (*(+(*))(+(*)(*)(*)(*)(*))) ➜ 5 (*(+(*))(+(*)(*)(*)(*)(*)(*))) ➜ 6 (*(+(*))(+(*)(*)(*)(*)(*)(*)(*))) ➜ 7 (*(+(*))(+(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 8 (*(+(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 9 (*(+(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 10 (*(+(*)(*))(+(*))) ➜ 2 (*(+(*)(*))(+(*)(*))) ➜ 4 (*(+(*)(*))(+(*)(*)(*))) ➜ 6 (*(+(*)(*))(+(*)(*)(*)(*))) ➜ 8 (*(+(*)(*))(+(*)(*)(*)(*)(*))) ➜ 10 (*(+(*)(*))(+(*)(*)(*)(*)(*)(*))) ➜ 12 (*(+(*)(*))(+(*)(*)(*)(*)(*)(*)(*))) ➜ 14 (*(+(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 16 (*(+(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 18 (*(+(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 20 (*(+(*)(*)(*))(+(*))) ➜ 3 (*(+(*)(*)(*))(+(*)(*))) ➜ 6 (*(+(*)(*)(*))(+(*)(*)(*))) ➜ 9 (*(+(*)(*)(*))(+(*)(*)(*)(*))) ➜ 12 (*(+(*)(*)(*))(+(*)(*)(*)(*)(*))) ➜ 15 (*(+(*)(*)(*))(+(*)(*)(*)(*)(*)(*))) ➜ 18 (*(+(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*))) ➜ 21 (*(+(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 24 (*(+(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 27 (*(+(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 30 (*(+(*)(*)(*)(*))(+(*))) ➜ 4 (*(+(*)(*)(*)(*))(+(*)(*))) ➜ 8 (*(+(*)(*)(*)(*))(+(*)(*)(*))) ➜ 12 (*(+(*)(*)(*)(*))(+(*)(*)(*)(*))) ➜ 16 (*(+(*)(*)(*)(*))(+(*)(*)(*)(*)(*))) ➜ 20 (*(+(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*))) ➜ 24 (*(+(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*))) ➜ 28 (*(+(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 32 (*(+(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 36 (*(+(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 40 (*(+(*)(*)(*)(*)(*))(+(*))) ➜ 5 (*(+(*)(*)(*)(*)(*))(+(*)(*))) ➜ 10 (*(+(*)(*)(*)(*)(*))(+(*)(*)(*))) ➜ 15 (*(+(*)(*)(*)(*)(*))(+(*)(*)(*)(*))) ➜ 20 (*(+(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*))) ➜ 25 (*(+(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*))) ➜ 30 (*(+(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*))) ➜ 35 (*(+(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 40 (*(+(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 45 (*(+(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 50 (*(+(*)(*)(*)(*)(*)(*))(+(*))) ➜ 6 (*(+(*)(*)(*)(*)(*)(*))(+(*)(*))) ➜ 12 (*(+(*)(*)(*)(*)(*)(*))(+(*)(*)(*))) ➜ 18 (*(+(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*))) ➜ 24 (*(+(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*))) ➜ 30 (*(+(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*))) ➜ 36 (*(+(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*))) ➜ 42 (*(+(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 48 (*(+(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 54 (*(+(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 60 (*(+(*)(*)(*)(*)(*)(*)(*))(+(*))) ➜ 7 (*(+(*)(*)(*)(*)(*)(*)(*))(+(*)(*))) ➜ 14 (*(+(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*))) ➜ 21 (*(+(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*))) ➜ 28 (*(+(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*))) ➜ 35 (*(+(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*))) ➜ 42 (*(+(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*))) ➜ 49 (*(+(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 56 (*(+(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 63 (*(+(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 70 (*(+(*)(*)(*)(*)(*)(*)(*)(*))(+(*))) ➜ 8 (*(+(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*))) ➜ 16 (*(+(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*))) ➜ 24 (*(+(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*))) ➜ 32 (*(+(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*))) ➜ 40 (*(+(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*))) ➜ 48 (*(+(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*))) ➜ 56 (*(+(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 64 (*(+(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 72 (*(+(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 80 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*))) ➜ 9 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*))) ➜ 18 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*))) ➜ 27 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*))) ➜ 36 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*))) ➜ 45 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*))) ➜ 54 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*))) ➜ 63 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 72 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 81 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 90 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*))) ➜ 10 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*))) ➜ 20 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*))) ➜ 30 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*))) ➜ 40 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*))) ➜ 50 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*))) ➜ 60 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*))) ➜ 70 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 80 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 90 (*(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*)(*)(*)(*)(*)(*))) ➜ 100 -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*)->1 2023-01-13 6:21 ` (*)->1 Jean Louis @ 2023-01-14 12:03 ` Michael Heerdegen 2023-01-14 12:33 ` (*)->1 Michael Heerdegen 0 siblings, 1 reply; 149+ messages in thread From: Michael Heerdegen @ 2023-01-14 12:03 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > Thus (+) ➜ 0 without value result should not be zero. If no values > where given to addition, no addition has taken place. Value of zero > should not get out of nothing. Mathematically it is neither right nor wrong. It is a convention to assign 0 to an empty sum. This is for convenience, and it doesn't lead to contradictions. It is convenient because if you decompose a sum into partial sums, equations remain correct for the corner case of empty partial sums: then the contribution of an empty partial sum to the whole sum is 0. Likewise for products and other operations. This convention is used in whole mathematics because it elegantly avoids case distinctions. It's also a useful convention in programming. For example, the initial value of an accumulator of a sum calculation is 0. If you sum up partial sums it would be nonsense to assign a special value for empty partial sums that behaves like 0 but means 0_{from zero summands}. We also don't have 7_{from 3 summands} we just have 7. The number of summands doesn't matter if you are interested in a sum, even when the number of summands is zero. Note that nobody will ever use the expression (+) directly to find 0 to try to learn something from it. But the case may appear in calculations like e.g. (apply #'+ args) and such where an empty arg list might appear. Some other perspective: when you play a video game and got no rewarded actions before game over, your score is typically 0. You could also get "void game" or no entry in the high score list. As I said, it's a mathematical convention, you can't derive something wrong from it, it's just convenient. We could make (+) error or emit something new but that would just make Elisp worse. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*)->1 2023-01-14 12:03 ` (*)->1 Michael Heerdegen @ 2023-01-14 12:33 ` Michael Heerdegen 0 siblings, 0 replies; 149+ messages in thread From: Michael Heerdegen @ 2023-01-14 12:33 UTC (permalink / raw) To: help-gnu-emacs Michael Heerdegen <michael_heerdegen@web.de> writes: > Jean Louis <bugs@gnu.support> writes: > > > Thus (+) ➜ 0 without value result should not be zero. If no values > > where given to addition, no addition has taken place. Value of zero > > should not get out of nothing. > > Mathematically it is neither right nor wrong. It is a convention to > assign 0 to an empty sum. This is for convenience, and it doesn't lead > to contradictions. Some more comments: 1. The mathematical background is the associative property in monoids: https://en.wikipedia.org/wiki/Monoid 2. You surely never complained about a^0 = 1 although "it's an empty product". You surely used that often because it's convenient. 3. Similar things in Lisp are (append) ==> () (concat) ==> "" (or) ==> nil (and) ==> t The result is always the neutral element of the associative operation. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-09 19:47 ` Jean Louis 2023-01-10 23:28 ` Emanuel Berg @ 2023-01-15 20:18 ` Rudolf Adamkovič 2023-01-15 20:57 ` Jean Louis 2023-01-15 21:08 ` Jean Louis 1 sibling, 2 replies; 149+ messages in thread From: Rudolf Adamkovič @ 2023-01-15 20:18 UTC (permalink / raw) To: Jean Louis, help-gnu-emacs Jean Louis <bugs@gnu.support> writes: >> (+) ➜ 0 > > Why? It is wrong. In Lisp, the `+' operator returns the sum of the additive identity with all of its arguments. The additive identity equals zero and you provided zero arguments. Hence, you get the additive identity. >> (*) ➜ 1 > > Why? It is wrong. In Lisp, the `*' operator returns the product of the multiplicative identity and all of its arguments. The multiplicative identity equals one and you provided zero arguments. Hence, you get the multiplicative identity. Rudy -- "The whole science is nothing more than a refinement of everyday thinking." -- Albert Einstein, 1879-1955 Rudolf Adamkovič <salutis@me.com> [he/him] Studenohorská 25 84103 Bratislava Slovakia ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-15 20:18 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Rudolf Adamkovič @ 2023-01-15 20:57 ` Jean Louis 2023-01-15 22:33 ` Drew Adams 2023-01-15 21:08 ` Jean Louis 1 sibling, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-15 20:57 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: help-gnu-emacs * Rudolf Adamkovič <salutis@me.com> [2023-01-15 23:19]: > Jean Louis <bugs@gnu.support> writes: > > >> (+) ➜ 0 > > > > Why? It is wrong. > > In Lisp, the `+' operator returns the sum of the additive identity with all of > its arguments. The additive identity equals zero and you provided zero > arguments. Hence, you get the additive identity. It is interesting and I understand that it does, not that I agree that it is correct. It is computer specific, not mathematics. Nothing is not zero mathematically, so if I don't add any arguments, there shall be no result that it is zero. Difference Between Zero and Nothing | Compare the Difference Between Similar Terms: https://www.differencebetween.com/difference-between-zero-and-vs-nothing/ What’s the difference between Zero and Nothing? • ‘Zero’ is a number while ‘nothing’ is a concept. • ‘Zero’ has numerical position value, while ‘nothing’ is not. • ‘Zero’ has its own properties in arithmetic, while nothing has any such properties. When we see function `+' Return sum of any number of arguments, which are numbers or markers. Thus sum of any number of no arguments cannot be zero, because there were no arguments. > >> (*) ➜ 1 > > > > Why? It is wrong. > > In Lisp, the `*' operator returns the product of the multiplicative identity and > all of its arguments. The multiplicative identity equals one and you provided > zero arguments. Hence, you get the multiplicative identity. Description says: (* &rest NUMBERS-OR-MARKERS) Return product of any number of arguments, which are numbers or markers. Product of no arguments cannot be possibly zero, so the function is mathematically and by description incorrect. I do understand that there is some LISP mystery why is it so. If nothing would be equal to zero then following would be equal: (* 0 0 ) ➜ 0 (*) ➜ 1 but they are not. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* RE: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-15 20:57 ` Jean Louis @ 2023-01-15 22:33 ` Drew Adams 2023-01-15 23:10 ` Emanuel Berg 2023-01-16 15:28 ` Jean Louis 0 siblings, 2 replies; 149+ messages in thread From: Drew Adams @ 2023-01-15 22:33 UTC (permalink / raw) To: Jean Louis, Rudolf Adamkovič; +Cc: help-gnu-emacs@gnu.org > Return sum of any number of arguments, which are numbers or markers. > > Thus sum of any number of no arguments cannot be zero, > because there were no arguments. Not to belabor this... but perhaps you're missing understanding _zero as a number_, in "number of arguments". More precisely: zero or more args. "Sum" can be defined in various ways, and yes, if it's defined to accept _any number of args_ then it's kosher, as one possibility, for "any number" to include the fine, upstanding number that is zero. > Description says: > (* &rest NUMBERS-OR-MARKERS) > Return product of any number of arguments, which are > numbers or markers. > > Product of no arguments cannot be possibly zero, so Yes, it can. And typically it is. See sum, above. Zero was apparently first considered a full-fledged number in the 7th century, in India. Europe didn't catch on till the 12th century. Before that, at most it was a bookkeeping _placeholder_ for an absence/nothing. > I do understand that there is some LISP mystery > why is it so. This has nothing per se to do with Lisp. And there's really no mystery. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-15 22:33 ` Drew Adams @ 2023-01-15 23:10 ` Emanuel Berg 2023-01-16 15:28 ` Jean Louis 1 sibling, 0 replies; 149+ messages in thread From: Emanuel Berg @ 2023-01-15 23:10 UTC (permalink / raw) To: help-gnu-emacs Drew Adams wrote: >> I do understand that there is some LISP mystery why is >> it so. > > This has nothing per se to do with Lisp. And there's really > no mystery. It's the identity element: https://en.wikipedia.org/wiki/Identity_element It makes sense in math and also in Lisp at least when we are implementing a math operator. This way it will make sense when we say "sum these elements and add that sum to some other sum". If "these elements" sometimes are no elements at all, adding 0 to the larger sum is what you want to do. -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-15 22:33 ` Drew Adams 2023-01-15 23:10 ` Emanuel Berg @ 2023-01-16 15:28 ` Jean Louis 2023-01-16 17:07 ` Drew Adams 1 sibling, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-16 15:28 UTC (permalink / raw) To: Drew Adams; +Cc: Rudolf Adamkovič, help-gnu-emacs@gnu.org * Drew Adams <drew.adams@oracle.com> [2023-01-16 01:33]: > > I do understand that there is some LISP mystery > > why is it so. > > This has nothing per se to do with Lisp. And there's > really no mystery. So is nothing to do with Lisp but is in Lisp, and is no source of information why is not so, but is not mystery. Then where is the reference why is it so in Lisp? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* RE: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 15:28 ` Jean Louis @ 2023-01-16 17:07 ` Drew Adams 2023-01-16 18:25 ` Jean Louis 0 siblings, 1 reply; 149+ messages in thread From: Drew Adams @ 2023-01-16 17:07 UTC (permalink / raw) To: Jean Louis; +Cc: Rudolf Adamkovič, help-gnu-emacs@gnu.org > > > I do understand that there is some LISP mystery > > > why is it so. > > > > This has nothing per se to do with Lisp. And there's > > really no mystery. > > So is nothing to do with Lisp but is in Lisp, and is no source of > information why is not so, but is not mystery. Then where is the > reference why is it so in Lisp? "This" in "This has nothing per se..." refers to "perhaps [what] you're missing [is] understanding _zero as a number_, in 'number of arguments'" (see my post). IOW, that "this" refers to what I explained about zero, zero arguments, and "any number of arguments", which is what I thought (and think) your basic confusion was (and is) about. If you understood what I explained, then I thought you'd likely understand Lisp's following the typical math convention here. Others have explained the use of zero as an identity in addition etc. As for Lisp, beyond the simplicity, familiarity, and elegance of following the typical math convention, there's a (resulting) practical reason: The use of `apply', pointed out by Anders, speaks directly to "any number of arguments". It applies a function (e.g. `+') to "any number of arguments", which are passed as a list. A list can be empty - zero elements. Letting `+' act on zero elements (and on one element, BTW) makes sense not only from a math point of view but even just from a practical Lisp point of view - as shown by not having to fiddle with any special cases when using `+': you can just use `apply', regardless of how many args there are to `+'. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 17:07 ` Drew Adams @ 2023-01-16 18:25 ` Jean Louis 2023-01-17 2:20 ` Drew Adams 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-16 18:25 UTC (permalink / raw) To: Drew Adams; +Cc: Rudolf Adamkovič, help-gnu-emacs@gnu.org * Drew Adams <drew.adams@oracle.com> [2023-01-16 20:07]: > > > > I do understand that there is some LISP mystery > > > > why is it so. > > > > > > This has nothing per se to do with Lisp. And there's > > > really no mystery. > > > > So is nothing to do with Lisp but is in Lisp, and is no source of > > information why is not so, but is not mystery. Then where is the > > reference why is it so in Lisp? > > "This" in "This has nothing per se..." refers to > "perhaps [what] you're missing [is] understanding > _zero as a number_, in 'number of arguments'" (see > my post). I understand better. Nevertheless description for those functions is not clearly written. > If you understood what I explained, then I thought > you'd likely understand Lisp's following the typical > math convention here. Sorry, but I still did not understand why. It is like asking why is that flower in your pocket on your suit, and you tell me how that flower is red, and it was always red flower of that type. But why is it on suit? > Others have explained the use of zero as an identity > in addition etc. Yes, I don't understand why is it in Lisp. > The use of `apply', pointed out by Anders, speaks > directly to "any number of arguments". It applies > a function (e.g. `+') to "any number of arguments", > which are passed as a list. Any number means also no argument? To me that is not clear. Any number of arguments is to me that it must be at least one argument, not no argument. I have got picture of justifications, but cannot see relation. Example: -------- * is a built-in function in ‘C source code’. (* &rest NUMBERS-OR-MARKERS) Return product of any number of arguments, which are numbers or markers. But without having arguments, the product is one, which contradicts multiplication how I know it. (*) ➜ 1 The Group Theory and identity is there as definitions which I could read, but I do not see relation between them and that function. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* RE: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 18:25 ` Jean Louis @ 2023-01-17 2:20 ` Drew Adams 2023-01-17 5:28 ` tomas ` (2 more replies) 0 siblings, 3 replies; 149+ messages in thread From: Drew Adams @ 2023-01-17 2:20 UTC (permalink / raw) To: Jean Louis; +Cc: Rudolf Adamkovič, help-gnu-emacs@gnu.org > > The use of `apply', pointed out by Anders, speaks > > directly to "any number of arguments". It applies > > a function (e.g. `+') to "any number of arguments", > > which are passed as a list. > > Any number means also no argument? To me that is not clear. That's why I pointed out that _zero is a number_. A zero number of args means zero args, which means no args. > Any number of arguments is to me that it must be at least one > argument, not no argument. Zero is a number. I have zero Ferraris. :-( > * is a built-in function in ‘C source code’. > (* &rest NUMBERS-OR-MARKERS) > Return product of any number of arguments, which are numbers or markers. > > But without having arguments, the product is one, > which contradicts multiplication how I know it. Yes, it's taking a shortcut, supposing that you think of a "product" of one arg and a "product" of zero args: (* N) -> N, (*) -> 0 But it's fairly common, for programmers at least, to consider a "product" function as accepting any number of arguments (or accepting a single list of any number of elements). Different definitions of a "product" function are possible. One that accepts zero or more numbers as args (or a list of such as arg) is handy - general, adaptable. > (*) ➜ 1 > The Group Theory and identity is there as definitions which I could > read, but I do not see relation between them and that function. Imagine that you wanted to define a "product" function that works with any number of args. What would _you_ define as its behavior (return value) for the zero-args case? And what would you use for the single-arg case? ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 2:20 ` Drew Adams @ 2023-01-17 5:28 ` tomas 2023-01-17 22:20 ` Drew Adams 2023-01-17 5:35 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Jean Louis 2023-01-17 11:52 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Michael Heerdegen 2 siblings, 1 reply; 149+ messages in thread From: tomas @ 2023-01-17 5:28 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 1667 bytes --] On Tue, Jan 17, 2023 at 02:20:45AM +0000, Drew Adams wrote: > > > The use of `apply', pointed out by Anders, speaks > > > directly to "any number of arguments". It applies > > > a function (e.g. `+') to "any number of arguments", > > > which are passed as a list. > > > > Any number means also no argument? To me that is not clear. > > That's why I pointed out that _zero is a number_. Those are big words :-) Minus one is also a number, but we'd be hard pressed to come up with a function taking minus one arguments. Three-quarters, the square root of two and pi are numbers. Arguably, "the" Chaitin constant [1] (actually there are many of them)is also a number. I think the manual wants to say "natural number" and just says "number", but that's OK, because it is directed at humans, and we humans are usually better at disambiguating given a context than at staying awake in front of long and boring texts. Arguably, "zero or more" might be clearer here, but I don't know (after all, the square root of two is bigger than zero, too). Now mathematicians don't agree on whether zero is a natural number. The faculty I studied in started counting from zero, but I've seen faculties which count from one. I once asked a friend of mine teaching at one uni, and he told me faculties having a strong mathematical logic department tended to start with zero. So zero may be a number or not, at least if you read "number" as "natural number", and you ask a mathematician :) Cheers [1] There are uncountably many horrible monsters in the real numbers: https://en.wikipedia.org/wiki/Chaitin%27s_constant -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* RE: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 5:28 ` tomas @ 2023-01-17 22:20 ` Drew Adams 2023-01-18 5:14 ` tomas 2023-01-18 14:32 ` Jean Louis 0 siblings, 2 replies; 149+ messages in thread From: Drew Adams @ 2023-01-17 22:20 UTC (permalink / raw) To: tomas@tuxteam.de, help-gnu-emacs@gnu.org > > > Any number means also no argument? To me that is not clear. > > > > That's why I pointed out that _zero is a number_. > > Those are big words :-) > > Minus one is also a number, but we'd be hard pressed to come > up with a function taking minus one arguments. Three-quarters, > the square root of two and pi are numbers. Arguably, "the" > Chaitin constant [1] (actually there are many of them)is also > a number. > > I think the manual wants to say "natural number" and just > says "number", but that's OK, because it is directed at humans, > and we humans are usually better at disambiguating given a > context than at staying awake in front of long and boring texts. > > Arguably, "zero or more" might be clearer here, but I don't > know (after all, the square root of two is bigger than zero, > too). 1. I said "More precisely: zero or more" in my second reply to this thread: Not to belabor this... but perhaps you're missing understanding _zero as a number_, in "number of arguments". More precisely: zero or more args. 2. There's no need to say anything more than "any number of arguments" - the number of args has to be zero or more, because we allow nullary functions. 3. If someone has a hard time with functions of variable arity, then just pretend you have this equivalent: replace each Lisp function that accepts a variable number of args with a function that accepts a _list arg_ (whose elements are what would be the variable number of args) in their place. Most functional, logic, etc. languages just use a list arg - same difference. There's nothing magic about variable-arity functions - they're really just functions that accept a list arg. ________________________ Jean Louis: Imagine that functions such as + and * accept a single _list_ argument, _instead of_ a variable number (including zero) of arguments. Can you see that such a function is useful? Can you see that it's general - and that you can even pass it the empty list or a singleton list? OK, let's look into that... Such functions would cdr down the list argument adding/multiplying the next number from the list by the sum/product accumulated so far. The functions would have to start with _some_ initial value for the accumulated sum/product. If they use simple recursion, applying the same operation at each level (add/multiply next number by accumulated sum/product), they need to start by initializing the sum/product. For them to seemingly start with the first number in the list they'd need to initialize instead within the general operation performed at each level, which would require extra fiddling, to (1) test whether it's the first time through and if so then (2) initialize. It's far simpler and more general for them to initialize at the top level: _before_ dealing with the first arg. The obvious init-value choice for + is zero, and the obvious choice for * is one. That's all that's going on. Or, what initial values would you have such functions start with, for their accumulating sum/product? Clearly you'd want + to start with 0 and * to start with 1, no? Now, what value would you have + return for a singleton list - e.g., (42)? What value would you have it return for the empty list, ()? I think you'd want (+ '(42)) to return 42 and (+ ()) to return 0, no? If so, why? (That's the question others have been answering by mentioning additive/multiplicative identities.) Now, since Lisp allows variable-arity functions, there's no reason to insist that an _explicit list_ be passed, instead of just the elements (numbers, here) that would be in that list. That's the shortcut that Lisp takes: don't bother to wrap the numbers in a list. (Creating lists is costly: consing, and then later garbage-collecting all those conses. Using an explicit list gains us nothing.) Now consider functions such as min and max. There's no minimum or maximum number, so they clearly can't be called with _no_ args. But they can be called with a _single_ arg, and, like + and *, their definitions return that number - it's _not compared_ with any other number, so how can we say it's the smallest or largest? It's the smallest/largest of the numbers provided - no comparison is needed. And as for doc, note that the doc tells us that there _must be at least one_ arg. Well, it doesn't tell you this in so many words (it could; perhaps it should). But the function signature is part of its doc, and `C-h f max' tells us: ___ max is a built-in function in ‘C source code’. (max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) Return largest of all the arguments (which must be numbers or markers). The value is always a number; markers are converted to numbers. ___ "NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS" tells you the function requires an argument, and it accepts more than one arg. If it didn't require at least one arg then the signature would be "&rest NUMBERS-OR-MARKERS ". ___ If you don't like Lisp's predefined +, *, etc. it's simple enough to roll your own, and make them _require at least 2_ arguments. E.g.: (defmacro my-plus (n1 n2 &rest ns) "..." `(+ ,n1 ,n2 ,@ns)) And if you prefer to handle the identity element explicitly, here's how to define a `plus' function that does what + does, using a more general, higher-order function, called `reduce', aka `foldr': (defun foldr (f init xs) (if (null xs) init (funcall f (car xs) (foldr f init (cdr xs))))) (defun plus (&rest ns) (foldr #'my-plus 0 ns)) That is, Elisp's + (named `plus' here), could be defined based on your `my-plus', using `foldr', passing it 0 (additive identity) as the initial element, argument INIT. `plus' is just (1) your `my-plus', which _requires two numbers_, (2) _folded_ into an _explicit list_ of numbers - a list that _can_ be empty or a singleton. Elisp's + acts the same as that `plus', but it's coded in C, and it creates no useless intermediate list (to be garbage-collected). ________________________ Back to Tomas's mail... > Now mathematicians don't agree on whether > zero is a natural number. That's just saying that they define "natural number" differently. > The faculty I studied in started counting from zero, > but I've seen faculties which count from one. I once asked > a friend of mine teaching at one uni, and he told me faculties > having a strong mathematical logic department tended to start > with zero. This is a red herring here. "Natural", "whole", "countable"/"counting" numbers are just names. Different definitions are sometimes given to the names, yes. When talking about the number of args a Lisp function accepts, or the number of elements a list can have, the counting is clearly zero-based: a function can be nullary, and a list can be empty: (). (Likewise, a string or a vector.) > So zero may be a number or not, at least if you read "number" > as "natural number", and you ask a mathematician :) And if you read "number" as "triangular number" then it's not. This is really irrelevant here. Clearly, if you read "number" as some set that _excludes zero_, then zero doesn't belong to it. Lisp functions can be nullary: take no arguments. How many arguments? Zero. What's the _number_ of arguments a nullary function takes? Zero. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 22:20 ` Drew Adams @ 2023-01-18 5:14 ` tomas 2023-01-18 5:26 ` Emanuel Berg 2023-01-18 17:27 ` Drew Adams 2023-01-18 14:32 ` Jean Louis 1 sibling, 2 replies; 149+ messages in thread From: tomas @ 2023-01-18 5:14 UTC (permalink / raw) To: Drew Adams; +Cc: help-gnu-emacs@gnu.org [-- Attachment #1: Type: text/plain, Size: 1054 bytes --] On Tue, Jan 17, 2023 at 10:20:47PM +0000, Drew Adams wrote: [...] > > Arguably, "zero or more" might be clearer here [...] [...] > 1. I said "More precisely: zero or more" in my > second reply to this thread: I was mulling over the manual's text, not over yours. > Not to belabor this... but perhaps you're missing > understanding _zero as a number_, in "number of > arguments". More precisely: zero or more args. I don't know who "you" is in this context: if you meant "me" -- I do consider zero as a number, even as a natural number (many influences conspirated towards that). My point rather is: - "number" is pretty vague, and in this context often used sloppily [1] as "natural number", sometimes also for "whole number". There are many other "numbers" - not everyone considers zero as a natural number (even mathematicians "disagree" on that: it seems to vary from faculty to faculty) - you need some amount of sloppiness to make a documentation even viable. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-18 5:14 ` tomas @ 2023-01-18 5:26 ` Emanuel Berg 2023-01-19 11:38 ` tomas 2023-01-18 17:27 ` Drew Adams 1 sibling, 1 reply; 149+ messages in thread From: Emanuel Berg @ 2023-01-18 5:26 UTC (permalink / raw) To: help-gnu-emacs tomas@tuxteam.de wrote: >> Not to belabor this... but perhaps you're missing >> understanding _zero as a number_, in "number of arguments". >> More precisely: zero or more args. > > I don't know who "you" is in this context: if you meant "me" > -- I do consider zero as a number, even as a natural number > (many influences conspirated towards that). 0 is not natural according to this source: https://dataswamp.org/~incal/data/numbers.txt But (+) evals to zero because it's practical ... -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-18 5:26 ` Emanuel Berg @ 2023-01-19 11:38 ` tomas 2023-01-19 11:51 ` Emanuel Berg 0 siblings, 1 reply; 149+ messages in thread From: tomas @ 2023-01-19 11:38 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 607 bytes --] On Wed, Jan 18, 2023 at 06:26:58AM +0100, Emanuel Berg wrote: > tomas@tuxteam.de wrote: > > >> Not to belabor this... but perhaps you're missing > >> understanding _zero as a number_, in "number of arguments". > >> More precisely: zero or more args. > > > > I don't know who "you" is in this context: if you meant "me" > > -- I do consider zero as a number, even as a natural number > > (many influences conspirated towards that). > > 0 is not natural according to this source: > > https://dataswamp.org/~incal/data/numbers.txt That source is wrong half of the time. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-19 11:38 ` tomas @ 2023-01-19 11:51 ` Emanuel Berg 2023-01-21 14:05 ` tomas 0 siblings, 1 reply; 149+ messages in thread From: Emanuel Berg @ 2023-01-19 11:51 UTC (permalink / raw) To: help-gnu-emacs tomas wrote: >> 0 is not natural according to this source: >> >> https://dataswamp.org/~incal/data/numbers.txt > > That source is wrong half of the time. The sources for the source are: https://davenport.libguides.com/math-skills-overview/basic-operations/sets https://www.geeksforgeeks.org/find-the-first-n-pure-numbers/ -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-19 11:51 ` Emanuel Berg @ 2023-01-21 14:05 ` tomas 2023-01-23 10:14 ` Robert Pluim 2023-01-23 16:44 ` Michael Heerdegen 0 siblings, 2 replies; 149+ messages in thread From: tomas @ 2023-01-21 14:05 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 863 bytes --] On Thu, Jan 19, 2023 at 12:51:04PM +0100, Emanuel Berg wrote: > tomas wrote: > > >> 0 is not natural according to this source: > >> > >> https://dataswamp.org/~incal/data/numbers.txt > > > > That source is wrong half of the time. > > The sources for the source are: > > https://davenport.libguides.com/math-skills-overview/basic-operations/sets > https://www.geeksforgeeks.org/find-the-first-n-pure-numbers/ Extend your sources. They aren't wrong, but they aren't right either. I recommend at least skimming this discussion, which gives an idea on how diverse the whole thing is: https://math.stackexchange.com/questions/283/is-0-a-natural-number The most interesting answers, which parody what has been happening here are those which say "it's this (or that) way because I learnt it in school, dammit". Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-21 14:05 ` tomas @ 2023-01-23 10:14 ` Robert Pluim 2023-01-23 16:44 ` Michael Heerdegen 1 sibling, 0 replies; 149+ messages in thread From: Robert Pluim @ 2023-01-23 10:14 UTC (permalink / raw) To: tomas; +Cc: help-gnu-emacs >>>>> On Sat, 21 Jan 2023 15:05:09 +0100, <tomas@tuxteam.de> said: nil> The most interesting answers, which parody what has been happening nil> here are those which say "it's this (or that) way because I learnt nil> it in school, dammit". I went to a secondary school where the answer changed depending on which teacher you talked to (they came from different countries :-)) Robert -- ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-21 14:05 ` tomas 2023-01-23 10:14 ` Robert Pluim @ 2023-01-23 16:44 ` Michael Heerdegen 2023-01-23 19:28 ` tomas 1 sibling, 1 reply; 149+ messages in thread From: Michael Heerdegen @ 2023-01-23 16:44 UTC (permalink / raw) To: tomas; +Cc: help-gnu-emacs <tomas@tuxteam.de> writes: > Extend your sources. They aren't wrong, but they aren't right either. BTW, treating 0 as a natural number or not reflects the difference in these two things: you start counting objects with 1 (the first, the second, ...). OTOH counts of finite sets include 0 as the count of the empty set - there can be 0 objects of a certain property. For both things you use the same set of numbers apart from 0. It's of no value to argue which procedure should be the defining one for the natural numbers. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-23 16:44 ` Michael Heerdegen @ 2023-01-23 19:28 ` tomas 0 siblings, 0 replies; 149+ messages in thread From: tomas @ 2023-01-23 19:28 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 1108 bytes --] On Mon, Jan 23, 2023 at 05:44:06PM +0100, Michael Heerdegen wrote: > <tomas@tuxteam.de> writes: > > > Extend your sources. They aren't wrong, but they aren't right either. > > BTW, treating 0 as a natural number or not reflects the difference in > these two things: you start counting objects with 1 (the first, the > second, ...). OTOH counts of finite sets include 0 as the count of the > empty set - there can be 0 objects of a certain property. > > For both things you use the same set of numbers apart from 0. It's > of no value to argue which procedure should be the defining one for the > natural numbers. Absolutely agree. For me, it's more interesting as a "sociology of mathematicians" issue. The most satisfying observation I've heard, as I already said, is that mathematical logic and set theory tends to zero-counting (that would somewhat explain computer science's affinity to that). But as I said, in my experience (Germany), it runs across whole faculties. "Our" algebra or analysis folks were zero-counters, too. But it might be incomplete. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* RE: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-18 5:14 ` tomas 2023-01-18 5:26 ` Emanuel Berg @ 2023-01-18 17:27 ` Drew Adams 2023-01-18 17:32 ` tomas 1 sibling, 1 reply; 149+ messages in thread From: Drew Adams @ 2023-01-18 17:27 UTC (permalink / raw) To: tomas@tuxteam.de; +Cc: help-gnu-emacs@gnu.org > > > Arguably, "zero or more" might be clearer here [...] > > > 1. I said "More precisely: zero or more" in my > > second reply to this thread: > > I was mulling over the manual's text, not over yours. > > > Not to belabor this... but perhaps you're > > missing understanding _zero as a number_, in > > "number of arguments". More precisely: zero > > or more args. > > I don't know who "you" is in this context: if you > meant "me" As I said, I quoted from my second reply in the thread, which was to Jean Louis. The "you" refer to is in that quoted reply to him. "You" meant Jean, there. And the context was "number of arguments". And as I pointed out, Elisp has nullary functions: functions that take zero arguments. "Any number of arguments" _means_, for Elisp, "zero or more args" -- "number" here _must_ include the number zero. Nothing more. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-18 17:27 ` Drew Adams @ 2023-01-18 17:32 ` tomas 0 siblings, 0 replies; 149+ messages in thread From: tomas @ 2023-01-18 17:32 UTC (permalink / raw) To: Drew Adams; +Cc: help-gnu-emacs@gnu.org [-- Attachment #1: Type: text/plain, Size: 689 bytes --] On Wed, Jan 18, 2023 at 05:27:08PM +0000, Drew Adams wrote: > > > > Arguably, "zero or more" might be clearer here [...] > > > > > 1. I said "More precisely: zero or more" in my > > > second reply to this thread: > > > > I was mulling over the manual's text, not over yours. > > > > > Not to belabor this... but perhaps you're > > > missing understanding _zero as a number_, in > > > "number of arguments". More precisely: zero > > > or more args. > > > > I don't know who "you" is in this context: if you > > meant "me" > > As I said, I quoted from my second reply in the thread, > which was to Jean Louis [...] I see. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 22:20 ` Drew Adams 2023-01-18 5:14 ` tomas @ 2023-01-18 14:32 ` Jean Louis 2023-01-18 20:36 ` Drew Adams 1 sibling, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-18 14:32 UTC (permalink / raw) To: Drew Adams; +Cc: tomas@tuxteam.de, help-gnu-emacs@gnu.org * Drew Adams <drew.adams@oracle.com> [2023-01-18 01:28]: > Jean Louis: > > Imagine that functions such as + and * accept a > single _list_ argument, _instead of_ a variable > number (including zero) of arguments. > > Can you see that such a function is useful? No. (* 2) ➜ 2 I do not see how it is useful, except for some funny stuff. > Can you see that it's general - and that you can even pass it the > empty list or a singleton list? I can't pass list in this way (* nil) and I do not know how you wish to pass it. If you mean with `apply', PicoLisp (*) ➜ NIL, but can do `apply', so I do not think that is problem really, and that it was made to make Lisp implementation work, if you mean that. > OK, let's look into that... > > Such functions would cdr down the list argument > adding/multiplying the next number from the list > by the sum/product accumulated so far. Was it so maybe in some early Lisp? I don't know C language, do you see in this definition of function some CDR? DEFUN ("*", Ftimes, Stimes, 0, MANY, 0, doc: /* Return product of any number of arguments, which are numbers or markers. usage: (* &rest NUMBERS-OR-MARKERS) */) (ptrdiff_t nargs, Lisp_Object *args) { if (nargs == 0) return make_fixnum (1); Lisp_Object a = check_number_coerce_marker (args[0]); return nargs == 1 ? a : arith_driver (Amult, nargs, args, a); } > The functions would have to start with _some_ initial value for the > accumulated sum/product. Is it so in the C language function? I can't see. > It's far simpler and more general for them to > initialize at the top level: _before_ dealing > with the first arg. The obvious init-value > choice for + is zero, and the obvious choice > for * is one. That's all that's going on. > > Or, what initial values would you have such > functions start with, for their accumulating > sum/product? Clearly you'd want + to start > with 0 and * to start with 1, no? If dividion (/ 10 2) is initialized with 10, then (* A B) can be initialized by A. I expect error. So there was some notion in Lisp that arguments shall be imagined: (* 10) ➜ 10 imagines absent element 1 (* 1 10) ➜ 10 (+ 10) ➜ 10 imagines absent element 0 (+ 0 10) ➜ 10 (- 10) ➜ -10 imagines absent element 0 (- 0 10) ➜ -10 (/ 10) ➜ 0 imagines absent elemet (/ 0 10) ➜ 0 Then imaginagion goes on: (*) ➜ 1 (+) ➜ 0 (-) ➜ 0 Without practical use I can only tell it is capricious decision. Maybe we can tell it this way: If there is any Emacs Lisp program which does not use (*) or (* a) anywhere but which would raise error if we re-define function to require 2 arguments -- then there must be some use of it. Otherwise I get idea it was just pecular decision. > Now, what value would you have + return for a > singleton list - e.g., (42)? What value would > you have it return for the empty list, ()? I > think you'd want (+ '(42)) to return 42 and > (+ ()) to return 0, no? If so, why? (That's > the question others have been answering by > mentioning additive/multiplicative identities.) Just that (+ nil) does not really work. Example cannot be shown practically. It is for adding numbers, not for adding numbers in a list. I understand you are extrapolating hypothesis which works for you, but the test for hypothesis is there above, to show the Emacs Lisp small program which without using single argument and in absence of argument would break if those functions would yield error instead of identity element. Which Emacs Lisp program will break if we demand 2 elements for *, - and + ? By answering that question we can see where it is usable. PicoLisp is confusing there as it asks for arguments, does not give identity elements and `apply' works alright. > Now consider functions such as min and max. > > There's no minimum or maximum number, so they > clearly can't be called with _no_ args. But > they can be called with a _single_ arg, and, > like + and *, their definitions return that > number - it's _not compared_ with any other > number, so how can we say it's the smallest > or largest? It's the smallest/largest of the > numbers provided - no comparison is needed. (min 1 2) ➜ 1 (max 2 3) ➜ 3 Then if * and + and - are analogous, I wish to find program that breaks if those functions require 2 arguments. Or do you think it was just made because it has to be made that way, and that is authoritative opinion of mathematicians, but we have absolutely no use of it in Lisp? If (/) gives error then (apply '/ '()) gives error. When (*) ➜ 1 does not give error (apply '* '()) ➜ 1 also does not give error. So is it about errors? If it is about errors, why then we allow / to have error but * not to have error? For me is not logical this: (apply '* '()) ➜ 1 because I want error to tell me that I did not provide arguments for multiplication. > If you don't like Lisp's predefined +, *, etc. > it's simple enough to roll your own, and make > them _require at least 2_ arguments. E.g.: > > (defmacro my-plus (n1 n2 &rest ns) > "..." > `(+ ,n1 ,n2 ,@ns)) OK let us see that: (defun my-plus (n1 n2 &rest ns) "..." (eval `(+ ,n1 ,n2 ,@ns))) (my-plus 2 2) ➜ 4 (my-plus 3 4 5) ➜ 12 (apply 'my-plus (list 3 4 5)) ➜ 12 (my-plus 3) -- error OK so that can work with `apply' quite well, even if not in that form, one could make it probaly in different way. It is thus not for reason of `apply'. So, I tend to conclude that reason is peculiar decision of some authors who wanted to make it look more "mathematical" (just because) even though there is no practical use of it. And I still hope to find the true background of it. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* RE: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-18 14:32 ` Jean Louis @ 2023-01-18 20:36 ` Drew Adams 2023-01-19 9:05 ` (*) -> 1 Jean Louis 0 siblings, 1 reply; 149+ messages in thread From: Drew Adams @ 2023-01-18 20:36 UTC (permalink / raw) To: Jean Louis; +Cc: tomas@tuxteam.de, help-gnu-emacs@gnu.org > > Imagine that functions such as + and * accept a > > single _list_ argument, _instead of_ a variable > > number (including zero) of arguments. > > > > Can you see that such a function is useful? > > No. > (* 2) ➜ 2 > I do not see how it is useful, except for some funny stuff. Are you not reading what I write? "single _list_ argument". I'm trying to help you understand the use of variable-arity functions. Most languages pass an explicit list of values instead of a variable number of args, to be able to act on multiple values. Folks who find variable arity odd can usually understand that it's essentially what they're already used to in the form of passing a list of values. That isn't unusual; variable arity is unusual. That's why I spoke about instead passing a _list_ of values. > > Can you see that it's general - and that you can > > even pass it the empty list or a singleton list? > > I can't pass list in this way (* nil) and I do not > know how you wish to pass it. See the code I provided. Passing a list of values to a unary `foo': (foo '(3 6 9)) (foo '(2)) (foo ()) Passing multiple values to a variable-arity `foo': (foo 3 6 9) (foo 2) (foo) Those are different functions. The idea's similar. That's all. The point was to show you how other languages accomplish the same thing (applying a function to an arbitrary number of values) - they use a list. > > OK, let's look into that... > > Such functions would cdr down the list argument > > adding/multiplying the next number from the list > > by the sum/product accumulated so far. > > Was it so maybe in some early Lisp? Don't know and don't care. It's common in languages where functions have typed signatures etc. That's what you have and do in Haskell, for instance: pass a list, if you want to act on an arbitrary number of values. > > It's far simpler and more general for them to > > initialize at the top level: _before_ dealing > > with the first arg. The obvious init-value > > choice for + is zero, and the obvious choice > > for * is one. That's all that's going on. > > > > Or, what initial values would you have such > > functions start with, for their accumulating > > sum/product? Clearly you'd want + to start > > with 0 and * to start with 1, no? > > If dividion (/ 10 2) is initialized with 10, then > (* A B) can be initialized by A. I expect error. No idea what wavelength you're on here; sorry. I was talking about initializing a function that accumulates - such as Elisp's +. > Without practical use I can only tell it is capricious decision. Without using it or understanding it you can continue to think so, I suppose. If you want to add four numbers without taking advantage of (+ 3 6 2 8), then just do so: (+ 3 (+ 6 (+ 2 8))) or (+ (+ (+ 3 6) 2) 8) or... Go for it - Lisp won't mind. > Maybe we can tell it this way: > If there is any Emacs Lisp program which does not use (*) or (* a) > anywhere but which would raise error if we re-define function > to require 2 arguments -- then there must be some use of it. How about + or * with more than 2 args? Do you think allowing that is also useless imagination, a capricious decision, madness imposed by useless mathematicians? If you can see how it can be useful to use + and * with more than 2 args, then the case for passing an arbitrary number of args is made. If your only problem now is seeing why allowing such generality should _also_ allow (+ 3) and (+) then I think we've made some progress. Submit an enhancement request if you like: Don't allow + and * (and the like) to accept less than two args. See how well that request goes over. > Otherwise I get idea it was just pecular decision. _Lisp_ is a peculiar decision all 'round. Get over it - that's my suggestion. Better is to understand it and put your own thinking in question first, but if you can't, or don't want to, do that then just get over it. I showed you how to code your own addition function that accepts two or more args. And it's just as easy to code your own that requires exactly two. Roll your own and be happy ever after. > > Now, what value would you have + return for a > > singleton list - e.g., (42)? What value would > > you have it return for the empty list, ()? I > > think you'd want (+ '(42)) to return 42 and > > (+ ()) to return 0, no? If so, why? (That's > > the question others have been answering by > > mentioning additive/multiplicative identities.) > > Just that (+ nil) does not really work. Example > cannot be shown practically. You're really not reading well. That was in the context of an addition function that accepts a single list arg instead of multiple args. It was for my apparently unsuccessful attempt to get you past the "peculiarity" of variable arity. > It is for adding numbers, not for adding numbers in a list. Q: How does one add multiple numbers in a single function call? A1: Pass them in a list argument. A2: Pass them as multiple arguments. A2 is possible only in languages that allow variable arity. A1, or fiddling with partial application, is what most languages use. > Which Emacs Lisp program will break if we demand > 2 elements for *, - and + ? Any that uses more than 2 args. There're thousands such uses. Your focusing on the nullary and single arg cases is _______. The main use of the variable arity of these functions is for _2 or more_ values. The uses of zero or one value are typically for a base case of a recursion or the limiting case of an iteration. Yes, such cases could instead use code that's a bit more complicated, bottoming out when getting down to 2 args. But who would want to need such bother? (You, I guess? Check back later.) > By answering that question we can see where it is usable. We see where it's usable. You haven't yet, but I'm certain you will at some point. > > Now consider functions such as min and max. > > > > There's no minimum or maximum number, so they > > clearly can't be called with _no_ args. But > > they can be called with a _single_ arg, and, > > like + and *, their definitions return that > > number - it's _not compared_ with any other > > number, so how can we say it's the smallest > > or largest? It's the smallest/largest of the > > numbers provided - no comparison is needed. > > (min 1 2) ➜ 1 > (max 2 3) ➜ 3 ?? You're really not reading, are you? > Or do you think it was just made because it has to be made that way, > and that is authoritative opinion of mathematicians, but we have > absolutely no use of it in Lisp? Do I think that? No. Does anyone? > If it is about errors, why then we allow / to have > error but * not to have error? Your questions about this have been answered over and over, by others. Division and subtraction are not the same as multiplication and addition. > For me is not logical this: (apply '* '()) ➜ 1 because I want error to > tell me that I did not provide arguments for multiplication. I gave you code to do that. > So, I tend to conclude that reason is peculiar decision of some > authors who wanted to make it look more "mathematical" (just because) > even though there is no practical use of it. > > And I still hope to find the true background of it. It doesn't sound like you do. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 20:36 ` Drew Adams @ 2023-01-19 9:05 ` Jean Louis 2023-01-19 9:41 ` Yuri Khan 2023-01-19 12:52 ` Anders Munch 0 siblings, 2 replies; 149+ messages in thread From: Jean Louis @ 2023-01-19 9:05 UTC (permalink / raw) To: Drew Adams; +Cc: tomas@tuxteam.de, help-gnu-emacs@gnu.org, Paul Eggert Hello Paul, I suppose you made (*) ➜ 1 function as such, please see and let me know if you know the reason why you added it. Too much was told about it on mailing list, but I can't find reasons. People tried to explain it with mathematics. Was the reason mathematical set theory? What was reason for your change in the `*' function back in 2018? * Drew Adams <drew.adams@oracle.com> [2023-01-18 23:37]: > See the code I provided. Passing a list of values > to a unary `foo': > > (foo '(3 6 9)) > (foo '(2)) > (foo ()) > > Passing multiple values to a variable-arity `foo': > > (foo 3 6 9) > (foo 2) > (foo) I understand that idea and understood in first time. Only that it does not fit in general context of any function. And explanation tries to fit it for every function. > > Without practical use I can only tell it is capricious decision. > > Without using it or understanding it you can > continue to think so, I suppose. And how can I understand if none of participants demonstrated the use? Not mentioning justifications how somewhere outside of Lisp something exists theoretically... that outside is not Emacs Lisp. > > Maybe we can tell it this way: > > If there is any Emacs Lisp program which does not use (*) or (* a) > > anywhere but which would raise error if we re-define function > > to require 2 arguments -- then there must be some use of it. > > How about + or * with more than 2 args? Do you > think allowing that is also useless imagination, > a capricious decision, madness imposed by useless > mathematicians? My question was simple. You counter with questions. Deviation from straight answer does not make it an answer. If there is any Emacs Lisp program which does not use (*) or (* a) anywhere but which would raise error if we re-define function to require 2 arguments? It is not a mind boggling question, it is practical question to understand if there is use of it. What is mind boggling is that people explain how it must be so, without showing use for it. I can make my private functions as I want, I can return funny stuff like "Doomed", and I can justify it that I don't like raising errors, or that I have seen game which gave me the idea to return that result. I believe there is plausible explanation which was not mentioned in the mailing list, as somebody must have the answer for it. Trying to explain it by using mathematics outside of Emacs without showing me use of it does not give me understanding. I am trying to search to root of it, and I find that function is defined as this: DEFUN ("*", Ftimes, Stimes, 0, MANY, 0, doc: /* Return product of any number of arguments, which are numbers or markers. usage: (* &rest NUMBERS-OR-MARKERS) */) (ptrdiff_t nargs, Lisp_Object *args) { if (nargs == 0) return make_fixnum (1); Lisp_Object a = check_number_coerce_marker (args[0]); return nargs == 1 ? a : arith_driver (Amult, nargs, args, a); } but back in time it was defined as following: https://github.com/emacs-mirror/emacs/blob/8f3a2c2659ddee1ae84b4b8bb28f6c388f87fd0f/src/data.c DEFUN ("*", Ftimes, Stimes, 0, MANY, 0, doc: /* Return product of any number of arguments, which are numbers or markers. usage: (* &rest NUMBERS-OR-MARKERS) */) (ptrdiff_t nargs, Lisp_Object *args) { return arith_driver (Amult, nargs, args); } and that was in August 5, 2013, and then by searching commmits, I can find: August 28, 2018, it was not there!!! Does that mean all of explanations by participants were not valid before that date? Then I look at the first time it appeared in Emacs: https://github.com/emacs-mirror/emacs/blob/fe042e9d15da7863b5beb4c2cc326a62d2c7fccb/src/data.c Improve arithmetic performance by avoiding bignums until needed. Also, simplify bignum memory management, fixing some unlikely leaks. This patch improved the performance of (+ 2 2) by a factor of ten on a simple microbenchmark computing (+ x 2), byte-compiled, with x a local variable initialized to 2 via means the byte compiler could not predict: performance improved from 135 to 13 ns. The platform was Fedora 28 x86-64, AMD Phenom II X4 910e. Performance also improved 0.6% on ‘make compile-always’. * src/bignum.c (init_bignum_once): New function. * src/emacs.c (main): Use it. * src/bignum.c (mpz): New global var. (make_integer_mpz): Rename from make_integer. All uses changed. * src/bignum.c (double_to_bignum, make_bignum_bits) (make_bignum, make_bigint, make_biguint, make_integer_mpz): * src/data.c (bignum_arith_driver, Frem, Flogcount, Fash) (expt_integer, Fadd1, Fsub1, Flognot): * src/floatfns.c (Fabs, rounding_driver, rounddiv_q): * src/fns.c (Fnthcdr): Use mpz rather than mpz_initting and mpz_clearing private temporaries. * src/bignum.h (bignum_integer): New function. * src/data.c (Frem, Fmod, Fash, expt_integer): * src/floatfns.c (rounding_driver): Use it to simplify code. * src/data.c (FIXNUMS_FIT_IN_LONG, free_mpz_value): Remove. All uses removed. (floating_point_op): New function. (floatop_arith_driver): New function, with much of the guts of the old float_arith_driver. (float_arith_driver): Use it. (floatop_arith_driver, arith_driver): Simplify by assuming NARGS is at least 2. All callers changed. (float_arith_driver): New arg, containing the partly converted value of the next arg. Reorder args for consistency. All uses changed. (bignum_arith_driver): New function. (arith_driver): Use it. Do fixnum-only integer calculations in intmax_t instead of mpz_t, when they fit. Break out mpz_t calculations into bignum_arith_driver. (Fquo): Use floatop_arith_driver instead of float_arith_driver, since the op is known to be valid. (Flogcount, Fash): Simplify by coalescing bignum and fixnum code. (Fadd1, Fsub1): Simplify by using make_int. As I cannot decipher above, does that mean that (*) ➜ 1 was added only for reason to speed up some C functions in Emacs? Is that the reason Paul? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 9:05 ` (*) -> 1 Jean Louis @ 2023-01-19 9:41 ` Yuri Khan 2023-01-19 12:52 ` Anders Munch 1 sibling, 0 replies; 149+ messages in thread From: Yuri Khan @ 2023-01-19 9:41 UTC (permalink / raw) To: Drew Adams, tomas@tuxteam.de, help-gnu-emacs@gnu.org, Paul Eggert On Thu, 19 Jan 2023 at 16:18, Jean Louis <bugs@gnu.support> wrote: > Then I look at the first time it appeared in Emacs: > https://github.com/emacs-mirror/emacs/blob/fe042e9d15da7863b5beb4c2cc326a62d2c7fccb/src/data.c > > Improve arithmetic performance by avoiding bignums until needed. > (floatop_arith_driver, arith_driver): > Simplify by assuming NARGS is at least 2. > All callers changed. > As I cannot decipher above, does that mean that (*) ➜ 1 was added only > for reason to speed up some C functions in Emacs? I understand the above as “before, calculation of 0- and 1-argument sums and products was handled by the generic implementations in floatop_arith_driver and arith_driver, but it turned out that detecting those cases early is cheaper”. If you read the version of arith_driver prior to this change, you will see the initialization of the accum variable with an identity value according to the operation, and then doing the binary operation on accum and each successive argument and storing the intermediate result back into accum. The actual logic of (+) and (*) for 0- and 1-argument cases did not change in that commit. You will have to dig deeper into the history if you want to find who introduced it first. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 9:05 ` (*) -> 1 Jean Louis 2023-01-19 9:41 ` Yuri Khan @ 2023-01-19 12:52 ` Anders Munch 1 sibling, 0 replies; 149+ messages in thread From: Anders Munch @ 2023-01-19 12:52 UTC (permalink / raw) To: help-gnu-emacs@gnu.org Jean Louis wrote: > If there is any Emacs Lisp program which does not use (*) or (* a) anywhere but which would raise error if we re-define function to require 2 arguments? Yes. Occurrences of (apply #'* ...) would fail at an alarming rate. regards, Anders ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 2:20 ` Drew Adams 2023-01-17 5:28 ` tomas @ 2023-01-17 5:35 ` Jean Louis 2023-01-17 15:59 ` Yuri Khan 2023-01-17 16:05 ` Michael Heerdegen 2023-01-17 11:52 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Michael Heerdegen 2 siblings, 2 replies; 149+ messages in thread From: Jean Louis @ 2023-01-17 5:35 UTC (permalink / raw) To: Drew Adams; +Cc: Rudolf Adamkovič, help-gnu-emacs@gnu.org * Drew Adams <drew.adams@oracle.com> [2023-01-17 05:21]: > > > The use of `apply', pointed out by Anders, speaks > > > directly to "any number of arguments". It applies > > > a function (e.g. `+') to "any number of arguments", > > > which are passed as a list. > > > > Any number means also no argument? To me that is not clear. > > That's why I pointed out that _zero is a number_. That is clear. > A zero number of args means zero args, which > means no args. Aha that is what you mean. Sounds like practical joke with function descriptions. Though that is not what is expressed like: * is a built-in function in ‘C source code’. (* &rest NUMBERS-OR-MARKERS) Return product of any number of arguments, which are numbers or markers. Product of any number of arguments when there are no arguments can't be 1 -- so function description is logically justified with your statement, but not consistent, I can't be sure if author intended it that way how you justify it, due to inconsistency. > > Any number of arguments is to me that it must be at least one > > argument, not no argument. > > Zero is a number. I have zero Ferraris. :-( Multiply your Ferraris and tell me if you get one in the garage. > > * is a built-in function in ‘C source code’. > > (* &rest NUMBERS-OR-MARKERS) > > Return product of any number of arguments, which are numbers or markers. > > > > But without having arguments, the product is one, > > which contradicts multiplication how I know it. > > Yes, it's taking a shortcut, supposing that you > think of a "product" of one arg and a "product" > of zero args: (* N) -> N, (*) -> 0 Not zero but: (*) ➜ 1 -- we are back to Ferrari. I don't get it. > Imagine that you wanted to define a "product" function that works > with any number of args. What would _you_ define as its behavior > (return value) for the zero-args case? And what would you use for > the single-arg case? I expect (*) to tell me that it is error, that arguments are missing. I learned multiplication in school, we never had impossible situation of using single argument. As number has to be multiplied by number. Multiplication table has always 2 arguments. The manual says like: > -- Function: + &rest numbers-or-markers > This function adds its arguments together. When given no > arguments, ‘+’ returns 0. 1 but I wonder why is that explained in manual and not in docstring. For now I can only think that it deviates from common multiplication that requires 2 numbers for the reason to be used in Lisp functions such as `apply' or others, just that I can't yet confirm it if that is designed for that particular reason. (apply '* nil) ➜ 1 -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 5:35 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Jean Louis @ 2023-01-17 15:59 ` Yuri Khan 2023-01-17 16:42 ` Jean Louis 2023-01-17 16:05 ` Michael Heerdegen 1 sibling, 1 reply; 149+ messages in thread From: Yuri Khan @ 2023-01-17 15:59 UTC (permalink / raw) To: Drew Adams, Rudolf Adamkovič, help-gnu-emacs@gnu.org On Tue, 17 Jan 2023 at 22:06, Jean Louis <bugs@gnu.support> wrote: > I learned multiplication in school, we never had impossible > situation of using single argument. As number has to be multiplied by > number. Multiplication table has always 2 arguments. I think we are getting somewhere. We have a common frame of reference: School multiplication. School defines multiplication as a binary operator, that is, taking two arguments. School then says multiplication is associative. That is, it does not matter which order you do it: (a * b) * c = a * (b * c). Because of this, it makes sense to talk about the product of a list of numbers: a * b * c * d * e. It has the same value whether you interpret it as (((a * b) * c) * d) * e or a * (b * (c * (d * e))). You can even say there is a multiplication operator that takes five arguments. Or four arguments. Or three. Or any natural number of arguments. Division, on the other hand, is not associative. If you say a / b / c, people give you a funny look and ask to please clarify whether you mean (a / b) / c or a / (b / c). Time passes. You are now at a university. They tell you zero is a natural number. You recall that funny multiplication operator that takes a natural number of arguments, which has a sound definition due to binary multiplication being associative. Since zero is a natural number, what should be the product of a zero length list of arguments? School had also said multiplying by 1 has the same effect as not multiplying at all. That is, a * 1 = a. Also, school had said that for every non-zero a, if a * b = a * c, then b = c, hadn’t it? Somewhere around the time you learned to solve equations. It was called canceling. Let’s look at that a * 1 = a. On the left, we have the product of two numbers. On the right, we have one number, and if we squint at it like this, we can say it’s a product of one number. So these are two products that have a common element. We can cancel it. (Assuming it’s not zero. But we know that a * 1 = a holds for any a, including non-zeros.) Now, on the left, we have 1. On the right… we have a product of no numbers. And there is an equality sign in between. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 15:59 ` Yuri Khan @ 2023-01-17 16:42 ` Jean Louis 0 siblings, 0 replies; 149+ messages in thread From: Jean Louis @ 2023-01-17 16:42 UTC (permalink / raw) To: Yuri Khan; +Cc: Drew Adams, Rudolf Adamkovič, help-gnu-emacs@gnu.org Thanks, I could follow the previous. * Yuri Khan <yuri.v.khan@gmail.com> [2023-01-17 19:00]: > School had also said multiplying by 1 has the same effect as not > multiplying at all. Not in absence of factors! > That is, a * 1 = a. Also, school had said that for every non-zero a, > if a * b = a * c, then b = c, hadn’t it? Somewhere around the time > you learned to solve equations. It was called canceling. I can see how you try to make it logic, but I do not ask for mathematics out of context of Lisp. I am asking why is in Lisp so? Common Lisp, Emacs Lisp, Guile, Newlisp, elk, with difference that Emacs Lisp (-) ➜ 0 but in others arguments missing, with Picolisp where (-) ➜ nil, (*) ➜ nil, (+) ➜ nil, but `apply' works. Why would Emacs Lisp have (-) ➜ 0 and other Lisps not? If `apply' works in Picolisp without problem, is the usage of such functions really the reason for yielding identity for (*), (+), (-)? > Let’s look at that a * 1 = a. On the left, we have the product of two > numbers. On the right, we have one number, and if we squint at it like > this, we can say it’s a product of one number. So these are two > products that have a common element. We can cancel it. (Assuming it’s > not zero. But we know that a * 1 = a holds for any a, including > non-zeros.) > > Now, on the left, we have 1. On the right… we have a product of no > numbers. And there is an equality sign in between. I have followed your guidance, but your guidance speaks of existence of something to cancel, and I speak of absence of arguments! Not even identity theory does not speak of identity elements in absence of everyting else! -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 5:35 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Jean Louis 2023-01-17 15:59 ` Yuri Khan @ 2023-01-17 16:05 ` Michael Heerdegen 2023-01-17 16:17 ` Yuri Khan ` (2 more replies) 1 sibling, 3 replies; 149+ messages in thread From: Michael Heerdegen @ 2023-01-17 16:05 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > > > Any number of arguments is to me that it must be at least one > > > argument, not no argument. > > > > Zero is a number. I have zero Ferraris. :-( > > Multiply your Ferraris and tell me if you get one in the garage. OTOH, multiplying someone's 2 Ferraris with his neighbor's 3 Ferraris giving 6 Ferraris makes perfectly sense, of course. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 16:05 ` Michael Heerdegen @ 2023-01-17 16:17 ` Yuri Khan 2023-01-17 16:25 ` tomas 2023-01-17 16:55 ` (*) -> 1 Jean Louis 2 siblings, 0 replies; 149+ messages in thread From: Yuri Khan @ 2023-01-17 16:17 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs On Tue, 17 Jan 2023 at 23:06, Michael Heerdegen <michael_heerdegen@web.de> wrote: > OTOH, multiplying someone's 2 Ferraris with his neighbor's 3 Ferraris > giving 6 Ferraris makes perfectly sense, of course. Hey! Dimension analysis police! That’s 6 *square* Ferraris for you. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 16:05 ` Michael Heerdegen 2023-01-17 16:17 ` Yuri Khan @ 2023-01-17 16:25 ` tomas 2023-01-17 16:55 ` (*) -> 1 Jean Louis 2 siblings, 0 replies; 149+ messages in thread From: tomas @ 2023-01-17 16:25 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 568 bytes --] On Tue, Jan 17, 2023 at 05:05:33PM +0100, Michael Heerdegen wrote: > Jean Louis <bugs@gnu.support> writes: > > > > > Any number of arguments is to me that it must be at least one > > > > argument, not no argument. > > > > > > Zero is a number. I have zero Ferraris. :-( > > > > Multiply your Ferraris and tell me if you get one in the garage. > > OTOH, multiplying someone's 2 Ferraris with his neighbor's 3 Ferraris > giving 6 Ferraris makes perfectly sense, of course. It's Ferraris squared (physicist here ;-) But then, yes. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 16:05 ` Michael Heerdegen 2023-01-17 16:17 ` Yuri Khan 2023-01-17 16:25 ` tomas @ 2023-01-17 16:55 ` Jean Louis 2023-01-17 17:52 ` Michael Heerdegen 2 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-17 16:55 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-17 19:08]: > Jean Louis <bugs@gnu.support> writes: > > > > > Any number of arguments is to me that it must be at least one > > > > argument, not no argument. > > > > > > Zero is a number. I have zero Ferraris. :-( > > > > Multiply your Ferraris and tell me if you get one in the garage. > > OTOH, multiplying someone's 2 Ferraris with his neighbor's 3 Ferraris > giving 6 Ferraris makes perfectly sense, of course. I guess it is joke on the joke with a pinch of irony. But multiplication of something in existence like some Ferraris in existence is not really my objection, or question. There is notion that out of of nothing (which is not `nil') being argument, in absence of factors for multiplication, we get result of one. (*) ➜ 1 According to above expression, the empty garage must yield with Ferrari, provided multiplication is done by Emacs Lisp or similar, but not with PicoLisp (it yields NIL). And for two empty garages, if operation is applied on each of them: (*) ➜ 1 (*) ➜ 1 We will get total of 2 Ferraris out of nothing. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 16:55 ` (*) -> 1 Jean Louis @ 2023-01-17 17:52 ` Michael Heerdegen 2023-01-17 18:11 ` Óscar Fuentes 2023-01-17 18:18 ` Jean Louis 0 siblings, 2 replies; 149+ messages in thread From: Michael Heerdegen @ 2023-01-17 17:52 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > (*) ➜ 1 > (*) ➜ 1 > > We will get total of 2 Ferraris out of nothing. And with (concat) we get an empty string in the garage out of nothing. (*) and (concat) obviously are not useful in conjunction with Ferraris. There is no interpretation in terms of Ferraris. We don't want to constrain math to things that have interpretations in Ferrari collections. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 17:52 ` Michael Heerdegen @ 2023-01-17 18:11 ` Óscar Fuentes 2023-01-17 18:40 ` Jean Louis 2023-01-17 21:12 ` Michael Heerdegen 2023-01-17 18:18 ` Jean Louis 1 sibling, 2 replies; 149+ messages in thread From: Óscar Fuentes @ 2023-01-17 18:11 UTC (permalink / raw) To: help-gnu-emacs Michael Heerdegen <michael_heerdegen@web.de> writes: > Jean Louis <bugs@gnu.support> writes: > >> (*) ➜ 1 >> (*) ➜ 1 >> >> We will get total of 2 Ferraris out of nothing. > > And with (concat) we get an empty string in the garage out of nothing. > > (*) and (concat) obviously are not useful in conjunction with Ferraris. > There is no interpretation in terms of Ferraris. > > We don't want to constrain math to things that have interpretations in > Ferrari collections. This is not about Mathematics, it is about notation, that means, convention, that means, convenience. In other programming languages an expression such as "+ 2" would yield a partially applied function: let f = + 2 f 5 -> 7 Lisp (or some implementations of it) went the route of "+ sums a list of numbers." That's fine, and in that sense having (+) -> 1 is reasonable, but there is nothing in Mathematics that says that it must be so instead of yielding partially applied function, or simply throwing an error message. Lisp's option is a consequence of its syntax (notation). ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 18:11 ` Óscar Fuentes @ 2023-01-17 18:40 ` Jean Louis 2023-01-17 19:04 ` Óscar Fuentes 2023-01-17 19:35 ` Michael Heerdegen 2023-01-17 21:12 ` Michael Heerdegen 1 sibling, 2 replies; 149+ messages in thread From: Jean Louis @ 2023-01-17 18:40 UTC (permalink / raw) To: Óscar Fuentes; +Cc: help-gnu-emacs * Óscar Fuentes <ofv@wanadoo.es> [2023-01-17 21:13]: > This is not about Mathematics, it is about notation, that means, > convention, that means, convenience. > > In other programming languages an expression such as "+ 2" would yield a > partially applied function: > > let f = + 2 > f 5 > -> 7 > > Lisp (or some implementations of it) went the route of "+ sums a list of > numbers." That's fine, and in that sense having (+) -> 1 is reasonable, > but there is nothing in Mathematics that says that it must be so instead > of yielding partially applied function, or simply throwing an error > message. Lisp's option is a consequence of its syntax (notation). Okay, but in C language definition of function `+' I see that if no arguments are supplied the result shall be 0, or for `*' the result shall be 1. So I see it from authoring side being something of importance, not from syntax side, as author, programmer, maybe Stallman, he could as well hande those functions with error, there was some reason why they deliberately explicitly decided to provide identity in absence of any arguments. At least I feel closer to solution after looking at "variadic functions". In the sense of minimizing errors, I have no example, is hard to understand that is the reason. In fact I need errors with many functions, as they are useful. I would not like really in my mathematical functions to get result 1 if I for example forgot to write something, instead of writing: (setq hours 10) ➜ 10 (setq interval 2) ➜ 2 (setq waiting-time 2) ➜ 2 (setq my-appointment (+ hours (* interval waiting-time))) ➜ 14 so if I write by mistake following: (setq my-appointment (+ hours (*))) ➜ 11 I would not like that mistake being there, as that would by my typo, and I need error, and not silent ignorance that I missed to write some arguments. I have given one example why and how I understand that function `*' would be more useful to yield the erorr, then 1. What I am searching is why is (*) function useful to yield 1 in some example. Do you have it? Can you maybe think of one? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 18:40 ` Jean Louis @ 2023-01-17 19:04 ` Óscar Fuentes 2023-01-18 13:15 ` Jean Louis 2023-01-17 19:35 ` Michael Heerdegen 1 sibling, 1 reply; 149+ messages in thread From: Óscar Fuentes @ 2023-01-17 19:04 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > * Óscar Fuentes <ofv@wanadoo.es> [2023-01-17 21:13]: >> This is not about Mathematics, it is about notation, that means, >> convention, that means, convenience. >> >> In other programming languages an expression such as "+ 2" would yield a >> partially applied function: >> >> let f = + 2 >> f 5 >> -> 7 >> >> Lisp (or some implementations of it) went the route of "+ sums a list of >> numbers." That's fine, and in that sense having (+) -> 1 is reasonable, >> but there is nothing in Mathematics that says that it must be so instead >> of yielding partially applied function, or simply throwing an error >> message. Lisp's option is a consequence of its syntax (notation). > > Okay, but in C language definition of function `+' I see that if no > arguments are supplied the result shall be 0, or for `*' the result > shall be 1. So I see it from authoring side being something of > importance, not from syntax side, as author, programmer, maybe > Stallman, he could as well hande those functions with error, there was > some reason why they deliberately explicitly decided to provide > identity in absence of any arguments. > > At least I feel closer to solution after looking at "variadic > functions". > > In the sense of minimizing errors, I have no example, is hard to > understand that is the reason. In fact I need errors with many > functions, as they are useful. > > I would not like really in my mathematical functions to get result 1 > if I for example forgot to write something, instead of writing: > > (setq hours 10) ➜ 10 > (setq interval 2) ➜ 2 > (setq waiting-time 2) ➜ 2 > (setq my-appointment (+ hours (* interval waiting-time))) ➜ 14 > so if I write by mistake following: > (setq my-appointment (+ hours (*))) ➜ 11 > > I would not like that mistake being there, as that would by my typo, > and I need error, and not silent ignorance that I missed to write some > arguments. > > I have given one example why and how I understand that function `*' > would be more useful to yield the erorr, then 1. > > What I am searching is why is (*) function useful to yield 1 in some > example. Do you have it? Can you maybe think of one? I think your confusion comes from an assumption that everybody else on this conversation is blind to, in the sense that nobody (I didn't read most of the thread, though) didn't explicitly stated it: + in Elisp is not the "plus" operation that we all know (the same C uses and school children use.) + in Elisp is not the binary operation, it is the summatory operator, which takes a list of arguments and returns the sum of them all. In that sense, maybe you can see more naturally that "the sum of nothing is zero." This makes possible to apply the + (summatory!) operator to any list of numbers, including the empty list. As for the * operator, it is the same case as +, with the caveat of not being so obvious that the multiplication of and empty list of numbers is 1. Here we choose convenience: as it is interesting to have all those n-adic operators work for an arbitrary number of arguments (including 0) we chose to return the "identity element" of the underlaying operation. The "identity element" e for a binary operation $ is the element that yields e $ n -> n n $ e -> n for all n. So for the logior case in your other message 0 is the identity element, as (logior n 0) -> (logior 0 n) -> n for all n. The language designers pursue convenience and consistency and take decisions based on some sense of what is "natural". Hence if we see as reasonable that the summatory of an empty list of arguments is zero (the identity element for summation) and we want for as much operators as possible to work on empty lists, we also choose to return the empty element for the underlaying operation of the operator on those cases. There are more supporting "reasons" for doing that, such as: (* 1 1 1) -> 1 (* 1 1) -> 1 (* 1) -> we want it to act as being equivalent to (* 1 1). (*) -> same. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 19:04 ` Óscar Fuentes @ 2023-01-18 13:15 ` Jean Louis 2023-01-18 14:37 ` Óscar Fuentes 2023-01-18 18:17 ` [External] : " Drew Adams 0 siblings, 2 replies; 149+ messages in thread From: Jean Louis @ 2023-01-18 13:15 UTC (permalink / raw) To: Óscar Fuentes; +Cc: help-gnu-emacs * Óscar Fuentes <ofv@wanadoo.es> [2023-01-17 22:06]: > I think your confusion comes from an assumption that everybody else on > this conversation is blind to, in the sense that nobody (I didn't read > most of the thread, though) didn't explicitly stated it: > > + in Elisp is not the "plus" operation that we all know (the same C uses > and school children use.) + in Elisp is not the binary operation, it is > the summatory operator, which takes a list of arguments and returns the > sum of them all. > > In that sense, maybe you can see more naturally that "the sum of nothing > is zero." This makes possible to apply the + (summatory!) operator to > any list of numbers, including the empty list. Do you mean with "C uses" that "C language uses"? > The language designers pursue convenience and consistency and take > decisions based on some sense of what is "natural". Hence if we see as > reasonable that the summatory of an empty list of arguments is zero (the > identity element for summation) and we want for as much operators as > possible to work on empty lists, we also choose to return the empty > element for the underlaying operation of the operator on those cases. > There are more supporting "reasons" for doing that, such as: OK I understand it as hypothesis, though is there reference that it was that way? Still missing the use case. I see it this way: - For this I don't see clearly why we are supposed to imagine 1 when two factors are required for multiplication. I would rather like error for missing argument. (* 2) ➜ 2 - Following makes no sense at all if we can't find actual usage for it. (*) ➜ 1 When we talk of identity elements, then I read here: https://en.wikipedia.org/wiki/Additive_identity In mathematics, the additive identity of a set that is equipped with the operation of addition is an element which, when added to any element x in the set, yields x. But we have here case of "not adding additive identity", because is not there: (+) I would say that (+ 2 0) ➜ 2 demonstrates the additive identity. It has to be added to other elements to be additive identity, it does not spring out of nothing. In that reference they speak of showing the identity first, not "without showing it at all", if nothing is there, then nothing was subject of addition, and so there is no result with additive identity. Similarly see here: https://brilliant.org/wiki/identity-element/ where it says: "An identity element in a set is an element that is special with respect to a binary operation on the set: when an identity element is paired with any element via the operation, it returns that element" So there must be elements in first place to say that something is identity element. We speak of absence of any elements. One less important question is why author of Lisp decided to yield 1 for (*), more important questions is of the use of it. Practically I found one use during sketching stage of programs, just to write it there as preliminary placeholders, like: (* (*) (*)) then in few minutes it is then expanded to: (* (* specific-gravity cubic-meter) (* )) then to be expanded to: (* (* specific-gravity cubic-meter) (* excavator-cycles hour)) Apart from few references on Internet we talked about, I cannot find uses for it, or purpose, it seem difficult. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 13:15 ` Jean Louis @ 2023-01-18 14:37 ` Óscar Fuentes 2023-01-18 18:17 ` [External] : " Drew Adams 1 sibling, 0 replies; 149+ messages in thread From: Óscar Fuentes @ 2023-01-18 14:37 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > * Óscar Fuentes <ofv@wanadoo.es> [2023-01-17 22:06]: >> I think your confusion comes from an assumption that everybody else on >> this conversation is blind to, in the sense that nobody (I didn't read >> most of the thread, though) didn't explicitly stated it: >> >> + in Elisp is not the "plus" operation that we all know (the same C uses >> and school children use.) + in Elisp is not the binary operation, it is >> the summatory operator, which takes a list of arguments and returns the >> sum of them all. >> >> In that sense, maybe you can see more naturally that "the sum of nothing >> is zero." This makes possible to apply the + (summatory!) operator to >> any list of numbers, including the empty list. > > Do you mean with "C uses" that "C language uses"? Yes. Please keep in mind that * in Elisp is not the same as * in C. Elisp provides a variadic function, while C provides a binary operator. > We speak of absence of any elements. One less important question is > why author of Lisp decided to yield 1 for (*), more important > questions is of the use of it. > > Practically I found one use during sketching stage of programs, just > to write it there as preliminary placeholders, like: > > (* (*) (*)) then in few minutes it is then expanded to: > > (* (* specific-gravity cubic-meter) (* )) > > then to be expanded to: > > (* (* specific-gravity cubic-meter) (* excavator-cycles hour)) > > Apart from few references on Internet we talked about, I cannot find > uses for it, or purpose, it seem difficult. So let's borrow an example from a previous post from Michael. Let's suppose you want to write a function that takes a list with the factors that represent a sequence of annual interest rates (so 1.05 is 5%, etc.) You want that function to return the equivalent rate for the period comprising those years: R1 * R2 * R3... A possible implementation would be: (defun equiv-rate (yearly-rates) (apply '* yearly-rates)) You use that value to calculate how much money you get from a deposit after those years. (defun money-after-years (initial-deposit yearly-rates) (* initial-deposit (equiv-rate yearly-rates))) But what happens if yearly-rates contains less than 2 elements? Let's see: If it contains just one element (one year) the result is the rate of that year. If it contains zero elements (zero years) the result shall be 1, otherwise money-after-years would be wrong: if you make a deposit, it must be the same after 0 years! So you adapt equiv-rate: (defun equiv-rate (yearly-rates) (case (length yearly-rates) (0 1) (1 (car yearly-rates)) (otherwise (apply '* (yearly-rates))))) But as it happens in Elisp, you can use the first, simple version of equiv-rate just fine, because the * variadic function already does the right thing for you. ^ permalink raw reply [flat|nested] 149+ messages in thread
* RE: [External] : Re: (*) -> 1 2023-01-18 13:15 ` Jean Louis 2023-01-18 14:37 ` Óscar Fuentes @ 2023-01-18 18:17 ` Drew Adams 1 sibling, 0 replies; 149+ messages in thread From: Drew Adams @ 2023-01-18 18:17 UTC (permalink / raw) To: Jean Louis, Óscar Fuentes; +Cc: help-gnu-emacs@gnu.org > I see it this way: > - For this I don't see clearly why we are supposed to imagine 1 when > two factors are required for multiplication. I would rather like > error for missing argument. I explained, and showed code, for how you can do this yourself - create your own `my-times' function that _requires_ exactly two args. I showed it for addition, not multiplication, but the code is the same. And I showed you how you could code an Elisp product function equivalent to Elisp's *, based only on your `my-times' function (which requires two args). Again, I showed it for addition/summation, not multiplication/product, but the code is the same. That latter code was just to show you the relation between the two - expressed in Elisp. You don't want/like variable-arity sum/product functions, for some reason. You can use your own, binary ones - you need never use + or *. I really suggest you take a look at the code and my explanation. I think that will help you understand all that you're so far confused about, wondering about, asking about, or interested in. Elisp doesn't bother defining binary functions for adding and multiplying. Instead it defines variable-arity versions (summation and product, if you prefer those names). It does so _because those are more general_ - you can use them with any number of args - including two. But if _you_ want binary versions, which raise an error if other than two args are passed, you can easily get that, with no cost. QED. There's really nothing more to say. The Elisp doc is fine here - it's correct, sufficient, and clear to just say that + and * take "any number of arguments". And readers should understand that "any number of args" for an Elisp function includes _zero_ args. Why? Because Elisp allows for nullary functions: it allows functions to take zero args. You seemed to think I was practical-joking when pointing out that the doc includes the zero-args case when it says "any number", _because_ zero can be the _number_ of args: > > A zero number of args means zero args, > > which means no args. > > Aha that is what you mean. Sounds like > practical joke with function descriptions. Nope; not a joke. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 18:40 ` Jean Louis 2023-01-17 19:04 ` Óscar Fuentes @ 2023-01-17 19:35 ` Michael Heerdegen 1 sibling, 0 replies; 149+ messages in thread From: Michael Heerdegen @ 2023-01-17 19:35 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > I have given one example why and how I understand that function `*' > would be more useful to yield the erorr, then 1. Ok, one math example. ----- ----- ----- | | | | | | | | f(k) = | | f(k) * | | f(k) | | | | | | m < k < n m < k < n m < k < n k prime k not prime Maybe the function f behaves very differently for primes and non-primes so it's easier to compute the product like that. But if an empty product would not be defined the whole formula would only make sense if there are primes between n and m, and the transformation would not be valid in the general case (since one would always have to test for primes between n and m - for no gain). Similar things "happen" in programming. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 18:11 ` Óscar Fuentes 2023-01-17 18:40 ` Jean Louis @ 2023-01-17 21:12 ` Michael Heerdegen 2023-01-17 22:01 ` Óscar Fuentes 1 sibling, 1 reply; 149+ messages in thread From: Michael Heerdegen @ 2023-01-17 21:12 UTC (permalink / raw) To: help-gnu-emacs Óscar Fuentes <ofv@wanadoo.es> writes: > In other programming languages an expression such as "+ 2" would yield a > partially applied function: > > let f = + 2 > f 5 > -> 7 The "dual" problem can also exist in this interpretation of notation, though: Would a partial application of `*' to no arguments result in a function multiplying the product of the arguments (with 1), or would it result in a function raising an error? What would this function applied to no arguments return? What would the partial application of `-' to a number return when applied to no arguments? Etc. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 21:12 ` Michael Heerdegen @ 2023-01-17 22:01 ` Óscar Fuentes 2023-01-17 23:38 ` Michael Heerdegen 0 siblings, 1 reply; 149+ messages in thread From: Óscar Fuentes @ 2023-01-17 22:01 UTC (permalink / raw) To: help-gnu-emacs Michael Heerdegen <michael_heerdegen@web.de> writes: > Óscar Fuentes <ofv@wanadoo.es> writes: > >> In other programming languages an expression such as "+ 2" would yield a >> partially applied function: >> >> let f = + 2 >> f 5 >> -> 7 > > The "dual" problem can also exist in this interpretation of notation, > though: > > Would a partial application of `*' to no arguments result in a function > multiplying the product of the arguments (with 1), or would it result in > a function raising an error? What would this function applied to no > arguments return? The function either has all arguments satisfied (and then it is computed) or not (and then it is a partially applied function). So `f' in the previous example: f -> f * 3 -> * 3 > What would the partial application of `-' to a number return when > applied to no arguments? Etc. I'm not sure I understand this question. Maybe this: let f = - 5 f 3 -> 2 or let f = - _ 3 ;; `_' stands for "absent argument" f 5 -> 2 The languages that use the concept of partially applied function usually have no support for variadic functions, so the duality problem you refer to is not an issue. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 22:01 ` Óscar Fuentes @ 2023-01-17 23:38 ` Michael Heerdegen 2023-01-18 7:50 ` Óscar Fuentes 0 siblings, 1 reply; 149+ messages in thread From: Michael Heerdegen @ 2023-01-17 23:38 UTC (permalink / raw) To: help-gnu-emacs Óscar Fuentes <ofv@wanadoo.es> writes: > The languages that use the concept of partially applied function usually > have no support for variadic functions, so the duality problem you refer > to is not an issue. Interesting. I do not know many other languages. I see your point now: while I wrote about the procedure of finding an interpretation [of the technical or mathematical semantics of a formula] in the real world [this is what had been ongoing: Ferraris etc], you mention that even the technical/theoretical semantics of a formula like (*) can be different. This is an interesting point, especially since terms like "right" and "wrong" had been used. Although I think the "meaning" of the expression (*) in Elisp is clear, it describes a mathematical term, so the question, asked specifically for Elisp, has to be answered using the mathematical background. In my understanding the OP asked specifically about the empty algebraic product. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 23:38 ` Michael Heerdegen @ 2023-01-18 7:50 ` Óscar Fuentes 2023-01-18 8:37 ` tomas 0 siblings, 1 reply; 149+ messages in thread From: Óscar Fuentes @ 2023-01-18 7:50 UTC (permalink / raw) To: help-gnu-emacs Michael Heerdegen <michael_heerdegen@web.de> writes: > Óscar Fuentes <ofv@wanadoo.es> writes: > >> The languages that use the concept of partially applied function usually >> have no support for variadic functions, so the duality problem you refer >> to is not an issue. > > Interesting. I do not know many other languages. > > I see your point now: while I wrote about the procedure of finding an > interpretation [of the technical or mathematical semantics of a formula] > in the real world [this is what had been ongoing: Ferraris etc], you > mention that even the technical/theoretical semantics of a formula like > (*) can be different. This is an interesting point, especially since > terms like "right" and "wrong" had been used. > > Although I think the "meaning" of the expression (*) in Elisp is clear, > it describes a mathematical term, so the question, asked specifically > for Elisp, has to be answered using the mathematical background. In my > understanding the OP asked specifically about the empty algebraic > product. I was prompted to enter the discussion when I saw your reference to Mathematics. As almost every other math-related thing in computers, Elisp's + is a toy representation of Sigma. And then the relevant characteristics of Sigma for this discussion are a convention among practitioners, not a proper mathematical fact. Although it is possible that the implementors were inspired by Sigma, I think it is more probable that they made + variadic because s-exps like (+ (+ 1 2) 3) are awkward and then extended the function with support for 0 and 1 arguments because they are convenient when defining macros. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 7:50 ` Óscar Fuentes @ 2023-01-18 8:37 ` tomas 2023-01-18 12:46 ` Óscar Fuentes 0 siblings, 1 reply; 149+ messages in thread From: tomas @ 2023-01-18 8:37 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 2548 bytes --] On Wed, Jan 18, 2023 at 08:50:07AM +0100, Óscar Fuentes wrote: > Michael Heerdegen <michael_heerdegen@web.de> writes: > > > Óscar Fuentes <ofv@wanadoo.es> writes: > > > >> The languages that use the concept of partially applied function usually > >> have no support for variadic functions, so the duality problem you refer > >> to is not an issue. > > > > Interesting. I do not know many other languages. > > > > I see your point now: while I wrote about the procedure of finding an > > interpretation [of the technical or mathematical semantics of a formula] > > in the real world [this is what had been ongoing: Ferraris etc], you > > mention that even the technical/theoretical semantics of a formula like > > (*) can be different. This is an interesting point, especially since > > terms like "right" and "wrong" had been used. > > > > Although I think the "meaning" of the expression (*) in Elisp is clear, > > it describes a mathematical term, so the question, asked specifically > > for Elisp, has to be answered using the mathematical background. In my > > understanding the OP asked specifically about the empty algebraic > > product. > > I was prompted to enter the discussion when I saw your reference to > Mathematics. As almost every other math-related thing in computers, > Elisp's + is a toy representation of Sigma. And then the relevant > characteristics of Sigma for this discussion are a convention among > practitioners, not a proper mathematical fact. This goes a bit deeper: whenever you have an associative operator [i.e. (a + b) + c == a + (b + c)], 1. the "variadic extension" is straightforward, since you can leave out the parentheses in (a + (b + (c + ...))) without losing info 2. the extension to zero arguments is also straightforward *provided* you have a neutral element, since 0 + a == a. This works for products, logical and, or, set union and intersection, you name it (in mathematical logic, you often see the or/and cousins of Sigma and Pi; in set theory likewise the union/intersection things). > Although it is possible that the implementors were inspired by Sigma, I > think it is more probable that they made + variadic because s-exps like > (+ (+ 1 2) 3) are awkward and then extended the function with support > for 0 and 1 arguments because they are convenient when defining macros. I think a mathematician doesn't really distinguish between "Sigma" and just "sum". Sigma is just a notation. No magic, just maths. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 8:37 ` tomas @ 2023-01-18 12:46 ` Óscar Fuentes 2023-01-18 13:44 ` Michael Heerdegen 0 siblings, 1 reply; 149+ messages in thread From: Óscar Fuentes @ 2023-01-18 12:46 UTC (permalink / raw) To: help-gnu-emacs <tomas@tuxteam.de> writes: >> I was prompted to enter the discussion when I saw your reference to >> Mathematics. As almost every other math-related thing in computers, >> Elisp's + is a toy representation of Sigma. And then the relevant >> characteristics of Sigma for this discussion are a convention among >> practitioners, not a proper mathematical fact. > > This goes a bit deeper: whenever you have an associative operator > [i.e. (a + b) + c == a + (b + c)], > > 1. the "variadic extension" is straightforward, since you can leave > out the parentheses in (a + (b + (c + ...))) without losing info > 2. the extension to zero arguments is also straightforward *provided* > you have a neutral element, since 0 + a == a. > > This works for products, logical and, or, set union and intersection, > you name it (in mathematical logic, you often see the or/and cousins > of Sigma and Pi; in set theory likewise the union/intersection things). Yes. >> Although it is possible that the implementors were inspired by Sigma, I >> think it is more probable that they made + variadic because s-exps like >> (+ (+ 1 2) 3) are awkward and then extended the function with support >> for 0 and 1 arguments because they are convenient when defining macros. > > I think a mathematician doesn't really distinguish between "Sigma" and > just "sum". Sigma is just a notation. No magic, just maths. Sigma is often used with infinite terms, and then it no longer is a sum, at least not in the naive sense that Elisp + operates. Elisp + would correspond to the simplest incarnation of Sigma. Even a programmer can't assume that associativity and commutativity can be used on a long, finite, sum. But that's a digression. My point is that (+) and (+ n) are not supported (or, better said, appreciated) because some mathematical reason, but because they are as much convenient when writing macros as they are silly on "normal" code. It's about making easy for the programmer to do some mundane tasks, not about Mathematics. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 12:46 ` Óscar Fuentes @ 2023-01-18 13:44 ` Michael Heerdegen 2023-01-18 14:07 ` Óscar Fuentes 0 siblings, 1 reply; 149+ messages in thread From: Michael Heerdegen @ 2023-01-18 13:44 UTC (permalink / raw) To: help-gnu-emacs Óscar Fuentes <ofv@wanadoo.es> writes: > Even a programmer can't assume that associativity and commutativity > can be used on a long, finite, sum. As long as it's a sum, of course can a programmer assume that. > But that's a digression. My point is that (+) and (+ n) are not > supported (or, better said, appreciated) because some mathematical > reason, but because they are as much convenient when writing macros as > they are silly on "normal" code. It's about making easy for the > programmer to do some mundane tasks, not about Mathematics. No - the result of "1" is surely related to mathematics. It comes from the mathematical interpretation of the term (*) as empty product. You can interpret it differently, but the convention is the same and there for the same reason as the same convention for the empty product in math. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 13:44 ` Michael Heerdegen @ 2023-01-18 14:07 ` Óscar Fuentes 2023-01-18 16:19 ` Andreas Eder 0 siblings, 1 reply; 149+ messages in thread From: Óscar Fuentes @ 2023-01-18 14:07 UTC (permalink / raw) To: help-gnu-emacs Michael Heerdegen <michael_heerdegen@web.de> writes: > Óscar Fuentes <ofv@wanadoo.es> writes: > >> Even a programmer can't assume that associativity and commutativity >> can be used on a long, finite, sum. > > As long as it's a sum, of course can a programmer assume that. Of course not! Otherwise your numerical simulation can go very wrong :-) (hint: numbers in computers are approximate, adding small numbers to large numbers is a bad idea.) >> But that's a digression. My point is that (+) and (+ n) are not >> supported (or, better said, appreciated) because some mathematical >> reason, but because they are as much convenient when writing macros as >> they are silly on "normal" code. It's about making easy for the >> programmer to do some mundane tasks, not about Mathematics. > > No - the result of "1" is surely related to mathematics. It comes from > the mathematical interpretation of the term (*) as empty product. Sure. > You can interpret it differently, but the convention is the same and > there for the same reason as the same convention for the empty product > in math. Sure^2. I was talking about _why_ (*) and (* a) are supported in Elisp. Once the language designer chose to support those expressions and decided that they must return a number (instead of something else like a partially applied function) the value they shall return comes from the properties of the underlying operation, of course. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 14:07 ` Óscar Fuentes @ 2023-01-18 16:19 ` Andreas Eder 2023-01-18 17:14 ` Óscar Fuentes 0 siblings, 1 reply; 149+ messages in thread From: Andreas Eder @ 2023-01-18 16:19 UTC (permalink / raw) To: Óscar Fuentes; +Cc: help-gnu-emacs On Mi 18 Jan 2023 at 15:07, Óscar Fuentes <ofv@wanadoo.es> wrote: > Michael Heerdegen <michael_heerdegen@web.de> writes: > >> Óscar Fuentes <ofv@wanadoo.es> writes: >> >>> Even a programmer can't assume that associativity and commutativity >>> can be used on a long, finite, sum. >> >> As long as it's a sum, of course can a programmer assume that. > > Of course not! Otherwise your numerical simulation can go very wrong :-) > > (hint: numbers in computers are approximate, adding small numbers to > large numbers is a bad idea.) Only floating point numbers. Integers are exact and in lisps like elisp there is no artificial size limit. 'Andreas ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 16:19 ` Andreas Eder @ 2023-01-18 17:14 ` Óscar Fuentes 0 siblings, 0 replies; 149+ messages in thread From: Óscar Fuentes @ 2023-01-18 17:14 UTC (permalink / raw) To: help-gnu-emacs Andreas Eder <a_eder_muc@web.de> writes: > On Mi 18 Jan 2023 at 15:07, Óscar Fuentes <ofv@wanadoo.es> wrote: > >> Michael Heerdegen <michael_heerdegen@web.de> writes: >> >>> Óscar Fuentes <ofv@wanadoo.es> writes: >>> >>>> Even a programmer can't assume that associativity and commutativity >>>> can be used on a long, finite, sum. >>> >>> As long as it's a sum, of course can a programmer assume that. >> >> Of course not! Otherwise your numerical simulation can go very wrong :-) >> >> (hint: numbers in computers are approximate, adding small numbers to >> large numbers is a bad idea.) > > Only floating point numbers. Which proves my point :-) And you say "only" as if floating point numbers were rarely used. > Integers are exact and in lisps like elisp > there is no artificial size limit. If your calculation consists on adding arbitrary precision integers, *that's* a rarity. If your calculation adds fixed-width integers (which includes platform integers), you definitely need to worry about order of terms. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 17:52 ` Michael Heerdegen 2023-01-17 18:11 ` Óscar Fuentes @ 2023-01-17 18:18 ` Jean Louis 1 sibling, 0 replies; 149+ messages in thread From: Jean Louis @ 2023-01-17 18:18 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-17 20:54]: > Jean Louis <bugs@gnu.support> writes: > > > (*) ➜ 1 > > (*) ➜ 1 > > > > We will get total of 2 Ferraris out of nothing. > > And with (concat) we get an empty string in the garage out of > nothing. And why? (concat) ➜ "" Is it mathematical convention? Is it maybe just programming convention to minimize errors like we mentioned it? In case of `concat' I can understand that (concat nil) ➜ "" is useful, that is clear. Then in that sense I can also understand (concat) ➜ "" being useful as function need not be programmed to say there are no arguments, but simply accepts any arguments and at least delivers "" for empty list, even though for list it gives error (concat '("ok" "there")) So my understanding that it is for purpose of minimizing errors is in doubt, as for empty list it gives string, but for non-empty list it can't handle it. Then is hard to understand why is it convenient this: (-) ➜ 0 or (+) ➜ 0 but not this, where: (1-) yields with error, and why not -1? (1+) yields with error, and why not 1? I read in manual: -- Function: logior &rest ints-or-markers This function returns the bitwise inclusive OR of its arguments: the Nth bit is 1 in the result if, and only if, the Nth bit is 1 in at least one of the arguments. If there are no arguments, the result is 0, which is an identity element for this operation. If ‘logior’ is passed just one argument, it returns that argument. but nowhere else is "identity element" mentioned, so I still look for reasons why is identity element returned. To minimize the error? For that information to be acceptable I would like to find example of minimization of error. It seem hard to find it, even though it is attributed as being "handy" and "convenient" on Internet. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 2:20 ` Drew Adams 2023-01-17 5:28 ` tomas 2023-01-17 5:35 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Jean Louis @ 2023-01-17 11:52 ` Michael Heerdegen 2 siblings, 0 replies; 149+ messages in thread From: Michael Heerdegen @ 2023-01-17 11:52 UTC (permalink / raw) To: help-gnu-emacs Drew Adams <drew.adams@oracle.com> writes: > Yes, it's taking a shortcut, supposing that you > think of a "product" of one arg and a "product" > of zero args: (* N) -> N, (*) -> 0 > > But it's fairly common, for programmers at least, > to consider a "product" function as accepting any > number of arguments (or accepting a single list > of any number of elements). n^0 = 1. n^0 can be interpreted as an empty product of factors n. n*0 = 0. n*0 can be interpreted as an empty sum of summands n. That's all trivial stuff and used all the time - nobody would ever say that (* 3 0) ==> 0 is wrong or want to document this case specially. (+) and (*) are not very different, just a bit less often used in practice. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-15 20:18 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Rudolf Adamkovič 2023-01-15 20:57 ` Jean Louis @ 2023-01-15 21:08 ` Jean Louis 2023-01-16 5:02 ` Emanuel Berg ` (2 more replies) 1 sibling, 3 replies; 149+ messages in thread From: Jean Louis @ 2023-01-15 21:08 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: help-gnu-emacs * Rudolf Adamkovič <salutis@me.com> [2023-01-15 23:27]: > Jean Louis <bugs@gnu.support> writes: > > >> (+) ➜ 0 > > > > Why? It is wrong. > > In Lisp, the `+' operator returns the sum of the additive identity with all of > its arguments. The additive identity equals zero and you provided zero > arguments. Hence, you get the additive identity. Send me references on what is additive identity. Though that it is so, it does not answer why is it so. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-15 21:08 ` Jean Louis @ 2023-01-16 5:02 ` Emanuel Berg 2023-01-16 5:38 ` tomas 2023-01-16 7:55 ` Yuri Khan 2 siblings, 0 replies; 149+ messages in thread From: Emanuel Berg @ 2023-01-16 5:02 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: >> In Lisp, the `+' operator returns the sum of the additive >> identity with all of its arguments. The additive identity >> equals zero and you provided zero arguments. Hence, you get >> the additive identity. > > Send me references on what is additive identity. https://en.wikipedia.org/wiki/Identity_element > Though that it is so, it does not answer why is it so. So that a + 0 = a And for multiplication 1a = a so there, the identity element is 1. There is also an identity matrix and so on. -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-15 21:08 ` Jean Louis 2023-01-16 5:02 ` Emanuel Berg @ 2023-01-16 5:38 ` tomas 2023-01-16 10:10 ` Jean Louis ` (2 more replies) 2023-01-16 7:55 ` Yuri Khan 2 siblings, 3 replies; 149+ messages in thread From: tomas @ 2023-01-16 5:38 UTC (permalink / raw) To: help-gnu-emacs; +Cc: Rudolf Adamkovič [-- Attachment #1: Type: text/plain, Size: 997 bytes --] On Mon, Jan 16, 2023 at 12:08:33AM +0300, Jean Louis wrote: > * Rudolf Adamkovič <salutis@me.com> [2023-01-15 23:27]: > > Jean Louis <bugs@gnu.support> writes: > > > > >> (+) ➜ 0 > > > > > > Why? It is wrong. > > > > In Lisp, the `+' operator returns the sum of the additive identity with all of > > its arguments. The additive identity equals zero and you provided zero > > arguments. Hence, you get the additive identity. > > Send me references on what is additive identity. Identity element [0] as defined in group theory [1]. The association of 0 with + and 1 with * runs deeper in maths than you think. > Though that it is so, it does not answer why is it so. Those are, of course, conventions. As whether the natural numbers begin with 0 or 1. But the above is, AFAIK, most widespread among mathematicians, wheter the latter is not. Cheers [0] https://en.wikipedia.org/wiki/Identity_element [1] https://en.wikipedia.org/wiki/Group_theory -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 5:38 ` tomas @ 2023-01-16 10:10 ` Jean Louis 2023-01-16 10:41 ` Yuri Khan 2023-01-17 4:06 ` Emanuel Berg 2023-01-17 16:25 ` Nick Dokos 2 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-16 10:10 UTC (permalink / raw) To: tomas; +Cc: help-gnu-emacs, Rudolf Adamkovič * tomas@tuxteam.de <tomas@tuxteam.de> [2023-01-16 09:11]: > Identity element [0] as defined in group theory [1]. > > The association of 0 with + and 1 with * runs deeper in maths > than you think. > > > Though that it is so, it does not answer why is it so. > > Those are, of course, conventions. As whether the natural > numbers begin with 0 or 1. But the above is, AFAIK, most > widespread among mathematicians, wheter the latter is not. Thanks. I could see reference that identity element is the one that would not change the other elements if the operation would be applied. This alone makes sense. But it does not make sense why somebody have put it in Lisp. Do you know? I did not find any references by using Duckduckgo. (*) ➜ 1 (+) ➜ 0 (/) Wrong number of arguments: / (-) ➜ 0 The question why is not yet clear to me. Why is it in Lisp so? Why not then for `/' as well? Is it not possible? What is practical use of teaching functions to spit it identity element instead of doing "wrong number of arguments" just as for division? It is not explained in Emacs Lisp manual. If function `*' should without arguments return identity element by mathematical terminology, that is not explained. Then I see in Guile: (*) ➜ 1 (-) Wrong number of arguments to - (+) ➜ 0 (/) Wrong number of arguments to / CLISP: (-) EVAL: too few arguments given to -: (-) (*) ➜ 1 (+) ➜ 0 Why Emacs Lisp returns 0 for (-) and CLISP and Guile not? Finally, what is the actual use of it? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 10:10 ` Jean Louis @ 2023-01-16 10:41 ` Yuri Khan 2023-01-16 15:26 ` Jean Louis 0 siblings, 1 reply; 149+ messages in thread From: Yuri Khan @ 2023-01-16 10:41 UTC (permalink / raw) To: tomas, help-gnu-emacs, Rudolf Adamkovič On Mon, 16 Jan 2023 at 17:17, Jean Louis <bugs@gnu.support> wrote: > (*) ➜ 1 > (+) ➜ 0 > (/) Wrong number of arguments: / > (-) ➜ 0 > > The question why is not yet clear to me. Why is it in Lisp so? Subtraction and division are not monoid operations. As such, they do not have an associated identity value. They also choose to handle the single argument case specially: (- x) is equivalent to (- 0 x) and (/ x) is equivalent to (/ 1 x). Making (/) return the multiplicative identity would be consistent though. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 10:41 ` Yuri Khan @ 2023-01-16 15:26 ` Jean Louis 0 siblings, 0 replies; 149+ messages in thread From: Jean Louis @ 2023-01-16 15:26 UTC (permalink / raw) To: Yuri Khan; +Cc: tomas, help-gnu-emacs, Rudolf Adamkovič * Yuri Khan <yuri.v.khan@gmail.com> [2023-01-16 13:43]: > On Mon, 16 Jan 2023 at 17:17, Jean Louis <bugs@gnu.support> wrote: > > > (*) ➜ 1 > > (+) ➜ 0 > > (/) Wrong number of arguments: / > > (-) ➜ 0 > > > > The question why is not yet clear to me. Why is it in Lisp so? > > Subtraction and division are not monoid operations. As such, they do > not have an associated identity value. Why then substraction has associated identity value in Emacs Lisp? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 5:38 ` tomas 2023-01-16 10:10 ` Jean Louis @ 2023-01-17 4:06 ` Emanuel Berg 2023-01-17 14:00 ` tomas 2023-01-17 16:25 ` Nick Dokos 2 siblings, 1 reply; 149+ messages in thread From: Emanuel Berg @ 2023-01-17 4:06 UTC (permalink / raw) To: help-gnu-emacs tomas wrote: > https://en.wikipedia.org/wiki/Identity_element I have sent this link several times, don't know why my posts don't appear ... -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 4:06 ` Emanuel Berg @ 2023-01-17 14:00 ` tomas 2023-01-17 22:43 ` Emanuel Berg 0 siblings, 1 reply; 149+ messages in thread From: tomas @ 2023-01-17 14:00 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 345 bytes --] On Tue, Jan 17, 2023 at 05:06:19AM +0100, Emanuel Berg wrote: > tomas wrote: > > > https://en.wikipedia.org/wiki/Identity_element > > I have sent this link several times, don't know why my posts > don't appear ... They seem to do. Just a bit later. And in bunches. As if there was a Nagle algorithm to your posts. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 14:00 ` tomas @ 2023-01-17 22:43 ` Emanuel Berg 0 siblings, 0 replies; 149+ messages in thread From: Emanuel Berg @ 2023-01-17 22:43 UTC (permalink / raw) To: help-gnu-emacs tomas wrote: >>> https://en.wikipedia.org/wiki/Identity_element >> >> I have sent this link several times, don't know why my >> posts don't appear ... > > They seem to do. Just a bit later. And in bunches. As if > there was a Nagle algorithm to your posts. [A] means of improving the efficiency of TCP/IP networks by reducing the number of packets that need to be sent [...] https://en.wikipedia.org/wiki/Nagle%27s_algorithm -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 5:38 ` tomas 2023-01-16 10:10 ` Jean Louis 2023-01-17 4:06 ` Emanuel Berg @ 2023-01-17 16:25 ` Nick Dokos 2023-01-17 17:19 ` Jean Louis 2023-01-17 17:41 ` Nick Dokos 2 siblings, 2 replies; 149+ messages in thread From: Nick Dokos @ 2023-01-17 16:25 UTC (permalink / raw) To: help-gnu-emacs <tomas@tuxteam.de> writes: > On Mon, Jan 16, 2023 at 12:08:33AM +0300, Jean Louis wrote: >> * Rudolf Adamkovič <salutis@me.com> [2023-01-15 23:27]: >> > Jean Louis <bugs@gnu.support> writes: >> > >> > >> (+) ➜ 0 >> > > >> > > Why? It is wrong. >> > >> > In Lisp, the `+' operator returns the sum of the additive identity with all of >> > its arguments. The additive identity equals zero and you provided zero >> > arguments. Hence, you get the additive identity. >> >> Send me references on what is additive identity. > > Identity element [0] as defined in group theory [1]. > > The association of 0 with + and 1 with * runs deeper in maths > than you think. > >> Though that it is so, it does not answer why is it so. > > Those are, of course, conventions. As whether the natural > numbers begin with 0 or 1. But the above is, AFAIK, most > widespread among mathematicians, wheter the latter is not. > > Cheers > > [0] https://en.wikipedia.org/wiki/Identity_element > [1] https://en.wikipedia.org/wiki/Group_theory The "empty sum" and "empty product" conventions are described in the corresponding articles in Wikipedia too - they might help: https://en.wikipedia.org/wiki/Empty_sum https://en.wikipedia.org/wiki/Empty_product -- Nick ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 16:25 ` Nick Dokos @ 2023-01-17 17:19 ` Jean Louis 2023-02-11 4:38 ` Ruijie Yu via Users list for the GNU Emacs text editor 2023-01-17 17:41 ` Nick Dokos 1 sibling, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-17 17:19 UTC (permalink / raw) To: Nick Dokos; +Cc: help-gnu-emacs * Nick Dokos <ndokos@gmail.com> [2023-01-17 19:27]: > The "empty sum" and "empty product" conventions are described in the > corresponding articles in Wikipedia too - they might help: > > https://en.wikipedia.org/wiki/Empty_sum > https://en.wikipedia.org/wiki/Empty_product Thanks much. I understand that "summation" is not equal to "addition" as summation is the addition of a sequence of any kind of numbers, called addends or summands; the result is their sum or total: https://en.wikipedia.org/wiki/Summation Then back to: https://en.wikipedia.org/wiki/Empty_sum where it says: In mathematics, an empty sum, or nullary sum,[1] is a summation where the number of terms is zero. The natural way to extend non-empty sums[2] is to let the empty sum be the additive identity. Basically function `+' deals with summation, not with addition. But that is conclusion I can draw alone with help of your references, without confirmation by docstring, manual or some references. Though I do not understand why it has to deal with summation, and not straight with addition? What is use in Lisp? In this other reference: https://en.wikipedia.org/wiki/Empty_product the issue with Lisp is mentioned, and we can read, that in many programming languages it is so, like in Python, Lisp, but in Perl is not so, then it says: Multiplication is an infix operator and therefore a binary operator, complicating the notation of an empty product. Some programming languages handle this by implementing variadic functions. For example, the fully parenthesized prefix notation of Lisp languages gives rise to a natural notation for nullary functions: (* 2 2 2) ; evaluates to 8 (* 2 2) ; evaluates to 4 (* 2) ; evaluates to 2 (*) ; evaluates to 1 and: In mathematics and in computer programming, a variadic function is a function of indefinite arity, i.e., one which accepts a variable number of arguments. Support for variadic functions differs widely among programming languages. I may alone assume, while still needing confirmation, that Emacs Lisp, Common Lisp use those variadic function. Not that I have got stable feeling with it. Though that still does not tell me why? I have excluded the purpose for `apply' and similar functions as that is handled properly with PicoLisp where (*) ➜ NIL -- and maybe I am wrong, but with all references I came closer some reasoning. But all the reasoning is not confirmed in Lisp books. What I understand from C is thet if number of args nargs is 0 is that result shall be 1 -- that alone does not explain why and how is it useful in Lisp. DEFUN ("*", Ftimes, Stimes, 0, MANY, 0, doc: /* Return product of any number of arguments, which are numbers or markers. usage: (* &rest NUMBERS-OR-MARKERS) */) (ptrdiff_t nargs, Lisp_Object *args) { if (nargs == 0) return make_fixnum (1); Lisp_Object a = check_number_coerce_marker (args[0]); return nargs == 1 ? a : arith_driver (Amult, nargs, args, a); } -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 17:19 ` Jean Louis @ 2023-02-11 4:38 ` Ruijie Yu via Users list for the GNU Emacs text editor 2023-02-11 10:54 ` Jean Louis 0 siblings, 1 reply; 149+ messages in thread From: Ruijie Yu via Users list for the GNU Emacs text editor @ 2023-02-11 4:38 UTC (permalink / raw) To: Jean Louis; +Cc: Nick Dokos, help-gnu-emacs Hello Jean, It seems to me that you still have some lingering questions regarding this topic. See below for my attempt to answer them. Jean Louis <bugs@gnu.support> writes: > * Nick Dokos <ndokos@gmail.com> [2023-01-17 19:27]: >> The "empty sum" and "empty product" conventions are described in the >> corresponding articles in Wikipedia too - they might help: >> >> https://en.wikipedia.org/wiki/Empty_sum >> https://en.wikipedia.org/wiki/Empty_product > > Thanks much. > > I understand that "summation" is not equal to "addition" as summation > is the addition of a sequence of any kind of numbers, called addends > or summands; the result is their sum or total: > https://en.wikipedia.org/wiki/Summation > > Then back to: https://en.wikipedia.org/wiki/Empty_sum > where it says: > > In mathematics, an empty sum, or nullary sum,[1] is a summation where > the number of terms is zero. The natural way to extend non-empty > sums[2] is to let the empty sum be the additive identity. > > Basically function `+' deals with summation, not with addition. But > that is conclusion I can draw alone with help of your references, > without confirmation by docstring, manual or some references. > > Though I do not understand why it has to deal with summation, and not > straight with addition? What is use in Lisp? IIUC, are you asking why, within Emacs codebase, there is no 2-argument "addition" function, in addition to the variadic summation function known as `+'? And similarly, why there is no 2-argument "multiplication" function, in addition to the variadic product function known as `*'? IMO, the answer is threefold. I believe most, if not all, of them have been mentioned in previous messages of this thread, but hopefully by listing them below side by side, it makes a bit more sense to you. First, we can all agree that some sort of addition is needed, either 2-arg or variadic, in order to support the most basic functionalities like motions within a buffer and making calculations. Second, there should be plenty of cases (which I have not verified within the codebase) where summing up a list of numbers is needed. If the variadic "summation" function is not available, then each such library (first or third party) have to either implement their own summation function, or use something like `(cl-reduce #'add-two-numbers input-list :initial-value 0)'. Third, if it is determined that a "summation" function is needed, then the "addition" function is a strict subset of the summation function and no longer necessary. Suppose we have the two functions `add' (2-arg only) and `sum' (variadic), I hope you can agree that these two expressions are always equivalent in terms of their results: (add 1 2) ;=> 3 (sum 1 2) ;=> 3 Because of the reasons above, IMO, the Emacs maintainers made a consious decision that implementing the summation function as `+' is enough for all its use cases, and it would be no longer necessary to have a separate "addition" function. Similarly, they decided to implement the product function as `*'. Admittedly, they could have implemented the following summation function and have made `+' only accept 2 arguments, but not doing so is their decision to make and do not introduce real functional differences: (defun sum (nums) (cl-reduce #'+ nums :initial-value 0)) The reason Emacs gets to make this decision (as opposed to, for example, C) is because `+' and `*' are ordinary functions. Consider C: arithmetic expressions are made with an operator, a left-hand-side expression and a right-hand-side expression. There are no other "sides". Therefore, without introducing more complexity to the language (e.g. special-casing a "sum" function which takes generic, variadic arguments), it is only feasible for C to have 2-arg arithmetic operators. > In this other reference: https://en.wikipedia.org/wiki/Empty_product > the issue with Lisp is mentioned, and we can read, that in many > programming languages it is so, like in Python, Lisp, but in Perl is > not so, then it says: > > Multiplication is an infix operator and therefore a binary operator, > complicating the notation of an empty product. Some programming > languages handle this by implementing variadic functions. For example, > the fully parenthesized prefix notation of Lisp languages gives rise > to a natural notation for nullary functions: > > (* 2 2 2) ; evaluates to 8 > (* 2 2) ; evaluates to 4 > (* 2) ; evaluates to 2 > (*) ; evaluates to 1 > > and: > > In mathematics and in computer programming, a variadic function is a > function of indefinite arity, i.e., one which accepts a variable > number of arguments. Support for variadic functions differs widely > among programming languages. > > I may alone assume, while still needing confirmation, that Emacs Lisp, > Common Lisp use those variadic function. Not that I have got stable > feeling with it. > > Though that still does not tell me why? > > I have excluded the purpose for `apply' and similar functions as that > is handled properly with PicoLisp where (*) ➜ NIL -- and maybe I am > wrong, but with all references I came closer some reasoning. But all > the reasoning is not confirmed in Lisp books. I don't have an answer for why other lisp dialects have different defaults. > What I understand from C is thet if number of args nargs is 0 is that > result shall be 1 -- that alone does not explain why and how is it > useful in Lisp. > > DEFUN ("*", Ftimes, Stimes, 0, MANY, 0, > doc: /* Return product of any number of arguments, which are numbers or markers. > usage: (* &rest NUMBERS-OR-MARKERS) */) > (ptrdiff_t nargs, Lisp_Object *args) > { > if (nargs == 0) > return make_fixnum (1); > Lisp_Object a = check_number_coerce_marker (args[0]); > return nargs == 1 ? a : arith_driver (Amult, nargs, args, a); > } Regarding why the default values of summation and product are 0 and 1 respectively, here is a concrete example use case (with analysis) where said default values are needed: Consider you want to sum up *all values* inside a nested list to get a single value: (setq foo '((1 2 3 4) ;=> 10 () ;=> 0 (1)) ;=> 1 To sum it manually, you see that this is essentially summing up the list '(1 2 3 4 1) to get 11. You can also write the following expression to calculate the sum: (apply #'+ (mapcar (lambda (lst) (apply #'+ lst)) foo)) ;=> 11 Notice how you have skipped the empty sublist. In a sense, because this sublist is empty, you *don't add anything* to the accumulated result. Mathematically, that is the same as adding 0. Therefore, the only natural default value for summation is 0. This analysis can also be made for the default value of product, where when you skip an empty sublist, you *don't multiple anything* to the accumulated result, which is mathematically equivalent to multiplying by 1, which we can then conclude should be the natural default value for product. Hope that helps. Best, RY ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-02-11 4:38 ` Ruijie Yu via Users list for the GNU Emacs text editor @ 2023-02-11 10:54 ` Jean Louis 0 siblings, 0 replies; 149+ messages in thread From: Jean Louis @ 2023-02-11 10:54 UTC (permalink / raw) To: Ruijie Yu; +Cc: Nick Dokos, help-gnu-emacs Thanks for effort. Maybe you missed my actual question. I strive to express me well. But then it become easy to deviate and go in other subjects, branching to other justifications. > > Basically function `+' deals with summation, not with addition. I thank for your Explanations are not really what I asked > IIUC, are you asking why, within Emacs codebase, there is no 2-argument > "addition" function, in addition to the variadic summation function > known as `+'? And similarly, why there is no 2-argument > "multiplication" function, in addition to the variadic product function > known as `*'? Thanks. Though I did not ask that. That is not my expression. But I can rephrase it here, in this: Checklist for fact finding: --------------------------- - Is there any practical use for (*) ➜ 1 and (+) ➜ 0 alone? - To show me the practical use example, I think that finding examples of Emacs Lisp could be useful: - where such Lisp would break if function like `*' would require 2 arguments - with tiny refactoring to make sure of the result - for example why multiply single number? Where is practical use? - And maybe we could understand it from history of Lisp. But I could not find references. > First, we can all agree that some sort of addition is needed, either > 2-arg or variadic, in order to support the most basic functionalities > like motions within a buffer and making calculations. Thanks much for attempt, but that was not my question. > Second, there should be plenty of cases (which I have not verified > within the codebase) where summing up a list of numbers is needed. If > the variadic "summation" function is not available, then each such > library (first or third party) have to either implement their own > summation function, or use something like `(cl-reduce #'add-two-numbers > input-list :initial-value 0)'. Here we are. If there are plenty of results, please find me one. > Third, if it is determined that a "summation" function is needed, then > the "addition" function is a strict subset of the summation function and > no longer necessary. Suppose we have the two functions `add' (2-arg > only) and `sum' (variadic), I hope you can agree that these two > expressions are always equivalent in terms of their results: > > (add 1 2) ;=> 3 > (sum 1 2) ;=> 3 > > Because of the reasons above, IMO, the Emacs maintainers made a consious > decision that implementing the summation function as `+' is enough for > all its use cases, and it would be no longer necessary to have a > separate "addition" function. Similarly, they decided to implement the > product function as `*'. Thanks for your hypothetical explanation, though it does not show usage of (*) ➜ 1 and none of Emacs developers told me that it is so. Though what somebody was thinking could be maybe totally irrelevant, as maybe the real reasons are in history of Lisp. I am looking for facts, not for explanations in absence of facts. Human mind tend to be perfect. In absence of information, human mind tend to create information. Newly created information is not necessarily the origin of information. > > I have excluded the purpose for `apply' and similar functions as that > > is handled properly with PicoLisp where (*) ➜ NIL -- and maybe I am > > wrong, but with all references I came closer some reasoning. But all > > the reasoning is not confirmed in Lisp books. > > I don't have an answer for why other lisp dialects have different > defaults. You see? While I am thankful for your good intention, the reasoning you brought up is contradictory to the actual Picolisp example, as you do not have answer to it. > Regarding why the default values of summation and product are 0 and 1 > respectively, here is a concrete example use case (with analysis) where > said default values are needed: > > Consider you want to sum up *all values* inside a nested list to get > a single value: > > (setq foo > '((1 2 3 4) ;=> 10 > () ;=> 0 > (1)) ;=> 1 Your `setq' above misses parenthesis: (setq foo '((1 2 3 4) () (1))) ➜ ((1 2 3 4) nil (1)) > To sum it manually, you see that this is essentially summing up the > list '(1 2 3 4 1) to get 11. For me those are three lists, and I cannot know what author intended to do with it. It is just variable assignment. I am inspecting it and following your example. > You can also write the following expression to calculate the sum: > > (apply #'+ (mapcar (lambda (lst) (apply #'+ lst)) foo)) > ;=> 11 (apply #'+ (mapcar (lambda (lst) (apply #'+ lst)) foo)) ➜ 11 Though I would never do it as you, as "empty" value I would never have in the list. Why in the first place to bring yourself in position to have empty value which you need to add? For me that is wrong programming. > Notice how you have skipped the empty sublist. In a sense, because > this sublist is empty, you *don't add anything* to the accumulated > result. Mathematically, that is the same as adding 0. Therefore, > the only natural default value for summation is 0. You are basically explaining me how the above s-expression hides the real problem that programmer missed to provide number but provided NIL instead. And the actual problem cannot be found because of it. I would think different in that case: (apply #'+ (flatten-list foo)) ➜ 11 But if I am really providig NIL values in a list, I would remove them, so that at least for me remains readable, I must have some reason for NIL values: (let* ((foo '((1 2 3 4) () (1))) (foo (delq nil foo)) (foo (flatten-list foo))) (apply #'+ foo)) ➜ 11 Of course in real life the `foo' would most probably get value from some function. I am not impressed with the example. > This analysis can also be made for the default value of product, > where when you skip an empty sublist, you *don't multiple anything* > to the accumulated result, which is mathematically equivalent to > multiplying by 1, which we can then conclude should be the natural > default value for product. Analysis did not answer to me "how it is useful". It has given explanations which are beyond the practical use of functions like (*) ➜ 1 Let us say I want to multiply some elements of a list: ;; if I need to multiply elements, I do not need outside theory but ;; there is practical reason for multiplication. There shall be two ;; elements, if not, there is error: (let ((list '(2 3))) (cond ((cadr list) (apply #'* list))p (t (user-error "Not enough arguments")))) ➜ 6 (let ((list '(2))) (cond ((cadr list) (apply #'* list)) (t (user-error "Not enough arguments")))) User error here, as why in first place did I send single argument? Why in first place I wish to multiple something with nothing? And then if I really need "2" as result, then I find it better to consciously return such result: (let ((list '(2))) (cond ((cadr list) (apply #'* list)) ((car list) (car list)) (t (user-error "Not arguments")))) ➜ 2 And what about those people who do not want to return the sole argument? (let* ((books-on-shelves (ignore 'myfunction nil)) (shelves 2) (list (delq nil (list books-on-shelves shelves)))) (cond ((cadr list) (apply #'* list)) (t (user-error "Either shelves or books missing!")))) If there is expectation of books on each shelf, then that is what I wish to multiply. There is practical use visible in the function. If I have expectation to know how many books are on shelves, I cannot do this: (let* ((books-on-shelves (ignore 'myfunction nil)) (shelves 2) (list (delq nil (list books-on-shelves shelves)))) (format "Number of total books: %d" (apply #'* list))) ➜ "Number of total books: 2" But number of total books is not 2! Because for reason that (*) ➜ 1 then I am getting wrong result! --------------------------------------------------------------- I have shown you now practical example where (*) ➜ 1 is tricky as it would give incorrect result and hide the real issue. Do you have any example from me Checklist for fact finding how would (*) ➜ 1 be practically useful? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-17 16:25 ` Nick Dokos 2023-01-17 17:19 ` Jean Louis @ 2023-01-17 17:41 ` Nick Dokos 1 sibling, 0 replies; 149+ messages in thread From: Nick Dokos @ 2023-01-17 17:41 UTC (permalink / raw) To: help-gnu-emacs Nick Dokos <ndokos@gmail.com> writes: > <tomas@tuxteam.de> writes: > >> On Mon, Jan 16, 2023 at 12:08:33AM +0300, Jean Louis wrote: >>> * Rudolf Adamkovič <salutis@me.com> [2023-01-15 23:27]: >>> > Jean Louis <bugs@gnu.support> writes: >>> > >>> > >> (+) ➜ 0 >>> > > >>> > > Why? It is wrong. >>> > >>> > In Lisp, the `+' operator returns the sum of the additive identity with all of >>> > its arguments. The additive identity equals zero and you provided zero >>> > arguments. Hence, you get the additive identity. >>> >>> Send me references on what is additive identity. >> >> Identity element [0] as defined in group theory [1]. >> >> The association of 0 with + and 1 with * runs deeper in maths >> than you think. >> >>> Though that it is so, it does not answer why is it so. >> >> Those are, of course, conventions. As whether the natural >> numbers begin with 0 or 1. But the above is, AFAIK, most >> widespread among mathematicians, wheter the latter is not. >> >> Cheers >> >> [0] https://en.wikipedia.org/wiki/Identity_element >> [1] https://en.wikipedia.org/wiki/Group_theory > > The "empty sum" and "empty product" conventions are described in the > corresponding articles in Wikipedia too - they might help: > > https://en.wikipedia.org/wiki/Empty_sum > https://en.wikipedia.org/wiki/Empty_product Ugh - misposted to the wrong thread. Sorry about that. No idea how I managed that. -- Nick ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-15 21:08 ` Jean Louis 2023-01-16 5:02 ` Emanuel Berg 2023-01-16 5:38 ` tomas @ 2023-01-16 7:55 ` Yuri Khan 2023-01-16 10:16 ` Jean Louis 2 siblings, 1 reply; 149+ messages in thread From: Yuri Khan @ 2023-01-16 7:55 UTC (permalink / raw) To: Rudolf Adamkovič, help-gnu-emacs On Mon, 16 Jan 2023 at 11:44, Jean Louis <bugs@gnu.support> wrote: > > >> (+) ➜ 0 > > > > Send me references on what is additive identity. > > Though that it is so, it does not answer why is it so. Consider a sum of n elements: S = (+ x_1 … x_{n-1} x_n). By definition, it is equal to the sum of the first n-1 elements, plus the nth element: S = (+ x_1 … x_{n-1}) + x_n. No problem this far? (except for me mixing prefix and infix notation) Now, plug n=1 into this general formula. S = x_1 = (+) + x_1. Therefore, the sum of an empty list (+) has to be 0. In the same vein, a product of n elements: P = (* x_1 … x_{n-1} x_n) = (* x_1 … x_{n-1}) * x_n, which in the case of n=1 becomes P = x_1 = (*) * x_1. Therefore, the product of the empty list (*) has to be 1. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 7:55 ` Yuri Khan @ 2023-01-16 10:16 ` Jean Louis 2023-01-16 10:37 ` Yuri Khan 2023-01-16 10:51 ` Anders Munch 0 siblings, 2 replies; 149+ messages in thread From: Jean Louis @ 2023-01-16 10:16 UTC (permalink / raw) To: Yuri Khan; +Cc: Rudolf Adamkovič, help-gnu-emacs * Yuri Khan <yuri.v.khan@gmail.com> [2023-01-16 10:57]: > On Mon, 16 Jan 2023 at 11:44, Jean Louis <bugs@gnu.support> wrote: > > > > >> (+) ➜ 0 > > > > > > Send me references on what is additive identity. > > > > Though that it is so, it does not answer why is it so. > > Consider a sum of n elements: S = (+ x_1 … x_{n-1} x_n). > By definition, it is equal to the sum of the first n-1 elements, plus > the nth element: S = (+ x_1 … x_{n-1}) + x_n. No problem this far? > (except for me mixing prefix and infix notation) > > Now, plug n=1 into this general formula. > S = x_1 = (+) + x_1. > Therefore, the sum of an empty list (+) has to be 0. By above I do not see reference to Lisp. What you state above is not what Lisp function is supposed to do and it does not tell why is it so in Lisp, do you know? I understand "identity element" but I do not see relation between group theory and arithmetic function in Lisp context `+': > + is a built-in function in ‘C source code’. > (+ &rest NUMBERS-OR-MARKERS) > Return sum of any number of arguments, which are numbers or markers. It does not say "Return sum of any number of arguments, which are numbers or markers, or if no arguments return identity element by using group theory, blah..." I actually expect function to tell me wrong number of arguments or no arguments, as I find it safer for programming that way. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 10:16 ` Jean Louis @ 2023-01-16 10:37 ` Yuri Khan 2023-01-16 15:35 ` Jean Louis 2023-01-16 10:51 ` Anders Munch 1 sibling, 1 reply; 149+ messages in thread From: Yuri Khan @ 2023-01-16 10:37 UTC (permalink / raw) To: Yuri Khan, Rudolf Adamkovič, help-gnu-emacs On Mon, 16 Jan 2023 at 17:17, Jean Louis <bugs@gnu.support> wrote: > By above I do not see reference to Lisp. What you state above is not > what Lisp function is supposed to do and it does not tell why is it > so in Lisp, do you know? In mathematics the sum of zero elements is zero and the product of zero elements is one. In Lisp the + function implements the mathematical sum, and * the product. Lisp chooses to allow more than two arguments for the sum and product, so why would it impose any artificial restriction on less than one? > > + is a built-in function in ‘C source code’. > > (+ &rest NUMBERS-OR-MARKERS) > > Return sum of any number of arguments, which are numbers or markers. What it doesn’t say explicitly is that any markers are implicitly converted to numbers. After that, all arguments (if any) are numbers, and can be dealt with according to number rules. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 10:37 ` Yuri Khan @ 2023-01-16 15:35 ` Jean Louis 2023-01-16 15:59 ` Yuri Khan 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-16 15:35 UTC (permalink / raw) To: Yuri Khan; +Cc: Rudolf Adamkovič, help-gnu-emacs * Yuri Khan <yuri.v.khan@gmail.com> [2023-01-16 13:39]: > On Mon, 16 Jan 2023 at 17:17, Jean Louis <bugs@gnu.support> wrote: > > > By above I do not see reference to Lisp. What you state above is not > > what Lisp function is supposed to do and it does not tell why is it > > so in Lisp, do you know? > > In mathematics the sum of zero elements is zero and the product of > zero elements is one. There are no elements in this context. (+) ➜ 0 Multiplication of zero elements is also zero: (* 0 0) ➜ 0 but Lisp: (*) ➜ 1 It is not sufficiently logic. You can put X theories, but make it consistent. > In Lisp the + function implements the mathematical sum, and * the > product. Lisp chooses to allow more than two arguments for the sum > and product, so why would it impose any artificial restriction on > less than one? You may find it entertaining, but I did not get answer that way. > > > + is a built-in function in ‘C source code’. > > > (+ &rest NUMBERS-OR-MARKERS) > > > Return sum of any number of arguments, which are numbers or markers. > > What it doesn’t say explicitly is that any markers are implicitly > converted to numbers. After that, all arguments (if any) are numbers, > and can be dealt with according to number rules. Buffer location markers? How do I add markers to each other? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 15:35 ` Jean Louis @ 2023-01-16 15:59 ` Yuri Khan 2023-01-16 16:14 ` Jean Louis 0 siblings, 1 reply; 149+ messages in thread From: Yuri Khan @ 2023-01-16 15:59 UTC (permalink / raw) To: Yuri Khan, Rudolf Adamkovič, help-gnu-emacs On Mon, 16 Jan 2023 at 22:50, Jean Louis <bugs@gnu.support> wrote: > There are no elements in this context. > > (+) ➜ 0 There is a list of elements, and the length of that list is zero. > Multiplication of zero elements is also zero: > (* 0 0) ➜ 0 > but Lisp: > (*) ➜ 1 You are conflating elements of zero value with a zero count of elements. You are not willing to understand. I suspect you also will not believe me if I tell you all my dogs have green hair. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 15:59 ` Yuri Khan @ 2023-01-16 16:14 ` Jean Louis 2023-01-16 16:47 ` tomas 2023-01-16 17:07 ` Drew Adams 0 siblings, 2 replies; 149+ messages in thread From: Jean Louis @ 2023-01-16 16:14 UTC (permalink / raw) To: Yuri Khan; +Cc: Rudolf Adamkovič, help-gnu-emacs * Yuri Khan <yuri.v.khan@gmail.com> [2023-01-16 19:01]: > On Mon, 16 Jan 2023 at 22:50, Jean Louis <bugs@gnu.support> wrote: > > > There are no elements in this context. > > > > (+) ➜ 0 > > There is a list of elements, and the length of that list is zero. > > > Multiplication of zero elements is also zero: > > (* 0 0) ➜ 0 > > but Lisp: > > (*) ➜ 1 > > You are conflating elements of zero value with a zero count of elements. > > You are not willing to understand. I suspect you also will not believe > me if I tell you all my dogs have green hair. I am very willing to understand. This should not be place of laughing me out because I keep asking questions. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 16:14 ` Jean Louis @ 2023-01-16 16:47 ` tomas 2023-01-16 17:07 ` Drew Adams 1 sibling, 0 replies; 149+ messages in thread From: tomas @ 2023-01-16 16:47 UTC (permalink / raw) To: help-gnu-emacs; +Cc: Yuri Khan, Rudolf Adamkovič [-- Attachment #1: Type: text/plain, Size: 2471 bytes --] On Mon, Jan 16, 2023 at 07:14:49PM +0300, Jean Louis wrote: > * Yuri Khan <yuri.v.khan@gmail.com> [2023-01-16 19:01]: > > On Mon, 16 Jan 2023 at 22:50, Jean Louis <bugs@gnu.support> wrote: > > > > > There are no elements in this context. > > > > > > (+) ➜ 0 > > > > There is a list of elements, and the length of that list is zero. > > > > > Multiplication of zero elements is also zero: > > > (* 0 0) ➜ 0 > > > but Lisp: > > > (*) ➜ 1 > > > > You are conflating elements of zero value with a zero count of elements. > > > > You are not willing to understand. I suspect you also will not believe > > me if I tell you all my dogs have green hair. > > I am very willing to understand. This should not be place of laughing > me out because I keep asking questions. Again: the behaviour of Lisp's + and * is modeled after maths conventions. Assuming you've read both Wikipedia references I linked to you might understand why those conventions "make sense" (no they are not theorems or some such, just conventions, you notice that proofs and formulae are usually simpler). The mathematical things modeled by Lisp's + and * are the summation Σ and the product Π. In maths, the empty sum evaluates to 0, the empty product to 1 [1] [2] (for the last one: otherwise this would be at odds that a number raised to the zeroth power also yields 1). So why would Lisp, modeling numbers (roughly) after maths, deviate from math conventions? If you do functional programming, this corresponds nicely to anamorphisms [3]: you have a start value and a two-place funtion and calculate the next "start" value by combininb the old one with the next in the list. For sums, your start value would be zero. For products? Nah :) Cheers [1] "If the summation has no summands, then the evaluated sum is zero, because zero is the identity for addition. This is known as the empty sum." https://en.wikipedia.org/wiki/Sigma_notation#Special_cases [2] "[...] an empty product whose value is 1 -- regardless of the expression for the factors." https://en.wikipedia.org/wiki/Capital-pi_notation#Capital_pi_notation [3] Google called them "reduce" in their "map-reduce" framework, but they try to put their scent on everything. They didn't invent them. Oh, that's the way you can define aggregates in your beloved PostgreSQL, too. https://en.wikipedia.org/wiki/Anamorphism -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* RE: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 16:14 ` Jean Louis 2023-01-16 16:47 ` tomas @ 2023-01-16 17:07 ` Drew Adams 2023-01-16 18:41 ` Jean Louis 1 sibling, 1 reply; 149+ messages in thread From: Drew Adams @ 2023-01-16 17:07 UTC (permalink / raw) To: Jean Louis, Yuri Khan; +Cc: Rudolf Adamkovič, help-gnu-emacs@gnu.org > > You are not willing to understand. I suspect you also will not believe > > me if I tell you all my dogs have green hair. > > I am very willing to understand. This should not be place of laughing > me out because I keep asking questions. Agreed 100%. I think you are genuinely trying to understand, and that's behind your questions. I think the replies you've gotten already might well help you understand. Please consider rereading them. Sometimes it takes a little extra pondering, then suddenly a light bulb goes on, just by seeing something a little differently. (I remember that happening to me in a Physics class when the concept of a "field" finally grabbed hold of me.) ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 17:07 ` Drew Adams @ 2023-01-16 18:41 ` Jean Louis 0 siblings, 0 replies; 149+ messages in thread From: Jean Louis @ 2023-01-16 18:41 UTC (permalink / raw) To: Drew Adams; +Cc: Yuri Khan, Rudolf Adamkovič, help-gnu-emacs@gnu.org * Drew Adams <drew.adams@oracle.com> [2023-01-16 20:07]: > I think the replies you've gotten already might well help you > understand. Please consider rereading them. I do not dispute that group theory exists, or identity, and it is part of mathematic. I do not see relation between identity and lisp function which is supposed to give product of multiplication or sum of addition, and I can't imagine that Lisp authors did that to those functions for reasons to avoid `apply' function to fail. There are X number of mathematical stuff that is not represented in Lisp because it should not be there, a function should do one thing well. What is missing in my understanding is: - purpose of (*) ➜ 1, (-) ➜ 0 and (+) ➜ 0 as I do not understand how I would apply it else but making a funny Christmass tree in obscured programming and relation to Lisp. I have tried searching for references but can't find. (defun m (n) (let ((m)) (dotimes (b n) (setq m (cons "(*)" m))) (concat "(+" (string-join m) ")"))) (let ((first 1)) (insert "\n") (while (<= first 10) (let ((second 1)) (while (<= second 10) (insert "(*" (m first)(m second) ")\n") (setq second (1+ second))) (setq first (1+ first))))) One reference to it I find in "Common Lisp - A Gentle Introduction to Symbolic Computing": > Suppose x and y are lists. (REDUCE #’+ (APPEND x y)) should produce > the same value as the sum of (REDUCE #’+ x) and (REDUCE #’+ y). If y > is NIL, then (APPEND x y) equals x, so (REDUCE #’+ y) has to return > zero. Zero is the identity value for addition. That’s why calling + > with no arguments returns zero. Similarly, calling * with no arguments > returns one because one is the multiplicative identity. Let's compare: (let ((x '(3 3 3)) (y '(4 4 4))) (reduce #'* (append x y))) ➜ 1728 Same in Common Lisp (let ((x '(3 3 3)) (y '(4 4 4))) (+ (reduce #'+ x) (reduce #'+ y))) ➜ 21 Same in Common Lisp Am I wrong here making sum how it said I should make? (let ((x '(3 3 3)) (y nil)) (append x y)) ➜ (3 3 3) I cannot see that (append x y) equals x -- I cannot follow the example (let ((x '(3 3 3)) (y nil)) (reduce #'+ y)) ➜ 0 This is correct as in example Again I read "That's why calling + with no arguments returns zero" and do they mean that "why" is with reason to make function `reduce' work similarly like to make `apply' work? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 10:16 ` Jean Louis 2023-01-16 10:37 ` Yuri Khan @ 2023-01-16 10:51 ` Anders Munch 2023-01-16 15:38 ` Jean Louis 1 sibling, 1 reply; 149+ messages in thread From: Anders Munch @ 2023-01-16 10:51 UTC (permalink / raw) To: help-gnu-emacs@gnu.org Jean Louis wrote: > I actually expect function to tell me wrong number of arguments or no arguments, as I find it safer for programming that way. It makes sense for (+) to be an error, if it's written like that. But if the code goes (apply #'+ a-list-of-numbers) then a-list-of-numbers being empty is normal and expected, and 0 is invariably the desired result. You can't make the former an error without the latter becoming an error as well, so it isn't. regards, Anders ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 10:51 ` Anders Munch @ 2023-01-16 15:38 ` Jean Louis 2023-01-16 17:40 ` Andreas Eder 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-16 15:38 UTC (permalink / raw) To: Anders Munch; +Cc: help-gnu-emacs@gnu.org * Anders Munch <ajm@flonidan.dk> [2023-01-16 13:58]: > Jean Louis wrote: > > I actually expect function to tell me wrong number of arguments or no arguments, as I find it safer for programming that way. > > It makes sense for > (+) > to be an error, if it's written like that. > But if the code goes > (apply #'+ a-list-of-numbers) > then a-list-of-numbers being empty is normal and expected, and 0 is invariably the desired result. > You can't make the former an error without the latter becoming an error as well, so it isn't. (apply #'+ nil) that is what you mean why is it usable? than this is disaster: (apply #'* nil) ➜ 1 Do you wish to say that `apply' function is reason for this below? (*) ➜ 1 and (+) ➜ 0 and (-) ➜ 0 Maybe you know some reference to Lisp beginning why is it so? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 15:38 ` Jean Louis @ 2023-01-16 17:40 ` Andreas Eder 2023-01-16 18:17 ` tomas 2023-01-16 18:46 ` Jean Louis 0 siblings, 2 replies; 149+ messages in thread From: Andreas Eder @ 2023-01-16 17:40 UTC (permalink / raw) To: Anders Munch; +Cc: help-gnu-emacs@gnu.org On Mo 16 Jan 2023 at 18:38, Jean Louis <bugs@gnu.support> wrote: > * Anders Munch <ajm@flonidan.dk> [2023-01-16 13:58]: >> Jean Louis wrote: >> > I actually expect function to tell me wrong number of arguments or no arguments, as I find it safer for programming that way. >> >> It makes sense for >> (+) >> to be an error, if it's written like that. >> But if the code goes >> (apply #'+ a-list-of-numbers) >> then a-list-of-numbers being empty is normal and expected, and 0 is invariably the desired result. >> You can't make the former an error without the latter becoming an error as well, so it isn't. > > (apply #'+ nil) that is what you mean why is it usable? > > than this is disaster: > > (apply #'* nil) ➜ 1 > > Do you wish to say that `apply' function is reason for this below? > > (*) ➜ 1 and > (+) ➜ 0 and > (-) ➜ 0 > > Maybe you know some reference to Lisp beginning why is it so? See http://www.lispworks.com/documentation/HyperSpec/Body/f_pl.htm for #'+ and http://www.lispworks.com/documentation/HyperSpec/Body/f_st.htm for #'*. 'Andreas ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 17:40 ` Andreas Eder @ 2023-01-16 18:17 ` tomas 2023-01-16 18:55 ` Jean Louis 2023-01-16 18:46 ` Jean Louis 1 sibling, 1 reply; 149+ messages in thread From: tomas @ 2023-01-16 18:17 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 624 bytes --] On Mon, Jan 16, 2023 at 06:40:07PM +0100, Andreas Eder wrote: > On Mo 16 Jan 2023 at 18:38, Jean Louis <bugs@gnu.support> wrote: [...] > > Do you wish to say that `apply' function is reason for this below? > > > > (*) ➜ 1 and > > (+) ➜ 0 and > > (-) ➜ 0 > > > > Maybe you know some reference to Lisp beginning why is it so? > > See http://www.lispworks.com/documentation/HyperSpec/Body/f_pl.htm for > #'+ and http://www.lispworks.com/documentation/HyperSpec/Body/f_st.htm > for #'*. And -- oh, to make things more interesting: (and) => t (or) => f It's a conspiracy ;-) Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 18:17 ` tomas @ 2023-01-16 18:55 ` Jean Louis 2023-01-16 19:14 ` tomas 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-16 18:55 UTC (permalink / raw) To: tomas; +Cc: help-gnu-emacs * tomas@tuxteam.de <tomas@tuxteam.de> [2023-01-16 21:20]: > And -- oh, to make things more interesting: > > (and) => t > (or) => f > > It's a conspiracy ;-) Similar though not same: and is a special form in ‘C source code’. (and CONDITIONS...) Eval args until one of them yields nil, then return nil. The remaining args are not evalled at all. If no arg yields nil, return the last arg’s value. There is no description that it should return true without arguments. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 18:55 ` Jean Louis @ 2023-01-16 19:14 ` tomas 0 siblings, 0 replies; 149+ messages in thread From: tomas @ 2023-01-16 19:14 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 758 bytes --] On Mon, Jan 16, 2023 at 09:55:47PM +0300, Jean Louis wrote: > * tomas@tuxteam.de <tomas@tuxteam.de> [2023-01-16 21:20]: > > And -- oh, to make things more interesting: > > > > (and) => t > > (or) => f > > > > It's a conspiracy ;-) > > Similar though not same: The underlying mathematical structures are: - numbers (I'm handwaving a bit here) with + form a monoid, the neutral element is 0 - numbers with * form a monoid, the neutral element is 1 (if you need a group, you'll have to exclude 0, though) - booleans with and form a monoid, the neutral is t - booleans with or form a monoid, the neutral is nil Next: function composition: what is the neutral there? (this is what maths is good at) Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 17:40 ` Andreas Eder 2023-01-16 18:17 ` tomas @ 2023-01-16 18:46 ` Jean Louis 2023-01-17 2:37 ` Eduardo Ochs [not found] ` <87k01lica7.fsf@eder.anydns.info> 1 sibling, 2 replies; 149+ messages in thread From: Jean Louis @ 2023-01-16 18:46 UTC (permalink / raw) To: Andreas Eder; +Cc: Anders Munch, help-gnu-emacs@gnu.org * Andreas Eder <a_eder_muc@web.de> [2023-01-16 20:42]: > > Maybe you know some reference to Lisp beginning why is it so? > > See http://www.lispworks.com/documentation/HyperSpec/Body/f_pl.htm for > #'+ and http://www.lispworks.com/documentation/HyperSpec/Body/f_st.htm > for #'*. Thanks. "Returns the product of numbers, performing any necessary type conversions in the process. If no numbers are supplied, 1 is returned." I understand 1 is returned, yet I am still searching for purpose. For now vague purpose is only to satisfy some other functions which process lists, like `reduce' or `apply', I am searching for confirmation if that was the sole purpose. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration? 2023-01-16 18:46 ` Jean Louis @ 2023-01-17 2:37 ` Eduardo Ochs 2023-01-17 5:46 ` (*) -> 1 Jean Louis [not found] ` <87k01lica7.fsf@eder.anydns.info> 1 sibling, 1 reply; 149+ messages in thread From: Eduardo Ochs @ 2023-01-17 2:37 UTC (permalink / raw) To: Andreas Eder, Anders Munch, help-gnu-emacs@gnu.org On Mon, 16 Jan 2023 at 15:56, Jean Louis <bugs@gnu.support> wrote: > > * Andreas Eder <a_eder_muc@web.de> [2023-01-16 20:42]: > > > Maybe you know some reference to Lisp beginning why is it so? > > > > See http://www.lispworks.com/documentation/HyperSpec/Body/f_pl.htm for > > #'+ and http://www.lispworks.com/documentation/HyperSpec/Body/f_st.htm > > for #'*. > > Thanks. > > "Returns the product of numbers, performing any necessary type > conversions in the process. If no numbers are supplied, 1 is > returned." > > I understand 1 is returned, yet I am still searching for purpose. > > For now vague purpose is only to satisfy some other functions which > process lists, like `reduce' or `apply', I am searching for > confirmation if that was the sole purpose. Hi Jean, a few months ago I had to prepare some figures to explain to my students what should be the "neutral elements" for some operations... The main idea is that we want all these expressions to yield the same result, including the two last ones, that are weird, (+ (+ 2 2) (+ 2 2 2 2 2)) (+ (+ 2 2 2) (+ 2 2 2 2)) (+ (+ 2 2 2 2) (+ 2 2 2)) (+ (+ 2 2 2 2 2) (+ 2 2)) (+ (+ 2 2 2 2 2 2) (+ 2)) (+ (+ 2 2 2 2 2 2 2) (+)) and the same thing for these expressions: (* (* 2 2) (* 2 2 2 2 2)) (* (* 2 2 2) (* 2 2 2 2)) (* (* 2 2 2 2) (* 2 2 2)) (* (* 2 2 2 2 2) (* 2 2)) (* (* 2 2 2 2 2 2) (* 2)) (* (* 2 2 2 2 2 2 2) (*)) My figures are in the pages 86 and 87 of this PDF, http://angg.twu.net/LATEX/2022-2-C2-tudo.pdf#page=86 and my real objective was to convince them that we had very good reasons to decide that the result of (or) should be false the result of (and) should be true, and then extend these ideas to "for all" and "exists". Cheers, Eduardo ^ permalink raw reply [flat|nested] 149+ messages in thread
* (*) -> 1 2023-01-17 2:37 ` Eduardo Ochs @ 2023-01-17 5:46 ` Jean Louis 2023-01-17 15:56 ` Michael Heerdegen 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-17 5:46 UTC (permalink / raw) To: Eduardo Ochs; +Cc: Andreas Eder, Anders Munch, help-gnu-emacs@gnu.org * Eduardo Ochs <eduardoochs@gmail.com> [2023-01-17 05:39]: > a few months ago I had to prepare some figures to explain to my > students what should be the "neutral elements" for some operations... > The main idea is that we want all these expressions to yield the same > result, including the two last ones, that are weird, > > (+ (+ 2 2) (+ 2 2 2 2 2)) > (+ (+ 2 2 2) (+ 2 2 2 2)) > (+ (+ 2 2 2 2) (+ 2 2 2)) > (+ (+ 2 2 2 2 2) (+ 2 2)) > (+ (+ 2 2 2 2 2 2) (+ 2)) > (+ (+ 2 2 2 2 2 2 2) (+)) That still does not make sense to me. I translate that to ordinary notation: (2 + 2) + (2 + 2 + 2 + 2 + 2) (2 + 2 + 2) + (2 + 2 + 2 + 2) (2 + 2 + 2 + 2) + (2 + 2 + 2) (2 + 2 + 2 + 2 + 2) + (2 + 2) (2 + 2 + 2 + 2 + 2 + 2) + 2 (2 + 2 + 2 + 2 + 2 + 2 + 2) + -- this is impossible situation as summand is missing because "14 + " lacks summand. There must be some number first. People speak how Lisp follows mathematical conventions, but obviously it follows some, but not all. Convention in multiplication is that there must be two numbers, that is not followed, something else is followed. The reason behind is what? > and my real objective was to convince them that we had very good > reasons to decide that the result of (or) should be false the result > of (and) should be true, and then extend these ideas to "for all" and > "exists". I wish I could see that good reason. Just by placing (+) and expecting it to yield something is not clear that it is good reason. I expect it then also here, but it does not work: (/ (/ 2 2) (/)) So the above alone can't explain my why is it that Lisp uses identities. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 5:46 ` (*) -> 1 Jean Louis @ 2023-01-17 15:56 ` Michael Heerdegen 2023-01-17 16:29 ` Jean Louis 2023-01-18 9:02 ` Anders Munch 0 siblings, 2 replies; 149+ messages in thread From: Michael Heerdegen @ 2023-01-17 15:56 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > Convention in multiplication is that there must be two numbers, that > is not followed, something else is followed. There is no such convention. > I expect it then also here, but it does not work: > > (/ (/ 2 2) (/)) You don't listen to or don't understand what people write. Could you please try to do that before continuing this discussion? It doesn't seem to be the case that you are consulting the references that had been presented to you. So why are you keeping asking? Sorry to be direct like this, but what you are doing had been quite unfriendly for a while now. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 15:56 ` Michael Heerdegen @ 2023-01-17 16:29 ` Jean Louis 2023-01-17 16:43 ` tomas 2023-01-17 17:17 ` Michael Heerdegen 2023-01-18 9:02 ` Anders Munch 1 sibling, 2 replies; 149+ messages in thread From: Jean Louis @ 2023-01-17 16:29 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-17 18:58]: > Jean Louis <bugs@gnu.support> writes: > > > Convention in multiplication is that there must be two numbers, that > > is not followed, something else is followed. > > There is no such convention. Every elementary school is there to prove that convention of having at least two addends for addition and two factors for multiplication exists. Thus, sorry, you reality does not correspond to mine. There is no elementary school and I know many of them where pupils would learn how in absence of any factor one shall count 1. By chance, I am providing roomt to mathematics teacher who was not introduced to this discussion, and I just called him and asked him if there is anything that he knows that in absence of factors, the multiplication operation would yield with anything, and he has no idea what we are talking about. What idea he has is that there must be 2 known factors for multiplications and similar for addition. That there may be some convention is not excluded, and that there is identity element in mathematics is fine, but even the page of identity element does not speak of creation of identity elements, but of usage of identity elements. Then we have contradiction that description of functions `*' and `+' and `-' does not speak of any sets or group theory. And we have people speaking yes, group theory, sets. But not description of relation from sets to Lisp function, why? > You don't listen to or don't understand what people write. Could > you please try to do that before continuing this discussion? It > doesn't seem to be the case that you are consulting the references > that had been presented to you. So why are you keeping asking? > Sorry to be direct like this, but what you are doing had been quite > unfriendly for a while now. I am sorry for your feelings. Solution is simple, just do M-x doctor I have not find a reference. And I do not ask if identity element exists, neither if sets exists, etc. I am asking why is it in (some) Lisps? It is so far contradictory to explanation of what function is supposed to do. I can really understand and imagine, vividly, how you get angered by Jean Louis, who keep asking same question over again. No, I did not understand it. I have tried search engines. Where else shall I ask? Picolisp does not think same: (apply '+ '(1 2 3)) -> 6 and (+) -> NIL while in Emacs Lisp (apply '+ '(1 2 3)) ➜ 6 (+) ➜ 0 That makes vague the answer to "why" that one has to use it in such functions as `apply', as Picolisp obviously does not do that way. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 16:29 ` Jean Louis @ 2023-01-17 16:43 ` tomas 2023-01-17 17:25 ` Jean Louis 2023-01-17 17:17 ` Michael Heerdegen 1 sibling, 1 reply; 149+ messages in thread From: tomas @ 2023-01-17 16:43 UTC (permalink / raw) To: help-gnu-emacs; +Cc: Michael Heerdegen [-- Attachment #1: Type: text/plain, Size: 1445 bytes --] On Tue, Jan 17, 2023 at 07:29:32PM +0300, Jean Louis wrote: > * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-17 18:58]: > > Jean Louis <bugs@gnu.support> writes: > > > > > Convention in multiplication is that there must be two numbers, that > > > is not followed, something else is followed. > > > > There is no such convention. > > Every elementary school is there to prove that convention of having at > least two addends for addition and two factors for multiplication > exists. You shouldn't generalise what "every elementary school..." does. You wouldn't have Bessel functions then. Higher maths are a superset of (and sometimes a correction of) what is taught in elementary schools. Lisp takes this inspiration from higher maths. John McCarthy [1] was a mathematician by training and most definitely had no qualms with zero- or one-term products and sums. You have no choice but (believe me, I studied that too). As soon as you have general sum and product formulae, you /need/ to define what happens in border cases, and those conventions you seem to dislike so much have turned out to be the most convenient, probably since the mid-19th century. But I think we've wrangled enough with this. At least me. If you don't want to accept that others (including mathematicians) prefer other conventions than you do... please, keep your bubble. I'll keep mine :) I'm out of this. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 16:43 ` tomas @ 2023-01-17 17:25 ` Jean Louis 2023-01-17 19:11 ` Nick Dokos 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-17 17:25 UTC (permalink / raw) To: tomas; +Cc: help-gnu-emacs, Michael Heerdegen * tomas@tuxteam.de <tomas@tuxteam.de> [2023-01-17 19:45]: > Higher maths are a superset of (and sometimes a correction of) what > is taught in elementary schools. Lisp takes this inspiration from > higher maths. John McCarthy [1] was a mathematician by training and > most definitely had no qualms with zero- or one-term products and > sums. You have no choice but (believe me, I studied that too). As > soon as you have general sum and product formulae, you /need/ to > define what happens in border cases, and those conventions you seem > to dislike so much have turned out to be the most convenient, > probably since the mid-19th century. Thanks. I am following your hints, but I am not getting answer. If you know why they are convenient, can you please explain me? That is what I am asking. By following your guidance, I have found McCarthy Lisp: appleby/mccarthy-lisp: A toy lisp inspired by McCarthy's paper: https://github.com/appleby/mccarthy-lisp and I did not verify if that Lisp follows really McCarthy, but I git pull-ed it and compiled, and did not find reference in McCarthy's Lisp, because McCarthy says: mclisp> (*) Read Error: Expected start of Cons or Symbol, found: * ~/Programming/git/mccarthy-lisp $ make clang++ -I ./src -g -O3 -Wall -Wextra -std=c++11 src/main.cc -c -o src/main.o clang++ -I ./src -g -O3 -Wall -Wextra -std=c++11 src/alloc.cc -c -o src/alloc.o clang++ -I ./src -g -O3 -Wall -Wextra -std=c++11 src/cons.cc -c -o src/cons.o clang++ -I ./src -g -O3 -Wall -Wextra -std=c++11 src/env.cc -c -o src/env.o clang++ -I ./src -g -O3 -Wall -Wextra -std=c++11 src/error.cc -c -o src/error.o clang++ -I ./src -g -O3 -Wall -Wextra -std=c++11 src/eval.cc -c -o src/eval.o clang++ -I ./src -g -O3 -Wall -Wextra -std=c++11 src/init.cc -c -o src/init.o clang++ -I ./src -g -O3 -Wall -Wextra -std=c++11 src/lexer.cc -c -o src/lexer.o clang++ -I ./src -g -O3 -Wall -Wextra -std=c++11 src/load.cc -c -o src/load.o clang++ -I ./src -g -O3 -Wall -Wextra -std=c++11 src/reader.cc -c -o src/reader.o clang++ -I ./src -g -O3 -Wall -Wextra -std=c++11 src/utils.cc -c -o src/utils.o clang++ src/main.o src/alloc.o src/cons.o src/env.o src/error.o src/eval.o src/init.o src/lexer.o src/load.o src/reader.o src/utils.o -o mclisp ~/Programming/git/mccarthy-lisp $ ls difftests.lisp LICENSE Makefile mclisp* mclisp.lisp README.md src/ test/ test.lisp TODO ~/Programming/git/mccarthy-lisp $ ./mclisp Loading mclisp.lisp... done. mclisp> (*) Read Error: Expected start of Cons or Symbol, found: * mclisp> (-) Read Error: Expected start of Cons or Symbol, found: - mclisp> (+) Read Error: Expected start of Cons or Symbol, found: + mclisp> -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 17:25 ` Jean Louis @ 2023-01-17 19:11 ` Nick Dokos 0 siblings, 0 replies; 149+ messages in thread From: Nick Dokos @ 2023-01-17 19:11 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > * tomas@tuxteam.de <tomas@tuxteam.de> [2023-01-17 19:45]: >> Higher maths are a superset of (and sometimes a correction of) what >> is taught in elementary schools. Lisp takes this inspiration from >> higher maths. John McCarthy [1] was a mathematician by training and >> most definitely had no qualms with zero- or one-term products and >> sums. You have no choice but (believe me, I studied that too). As >> soon as you have general sum and product formulae, you /need/ to >> define what happens in border cases, and those conventions you seem >> to dislike so much have turned out to be the most convenient, >> probably since the mid-19th century. > > Thanks. I am following your hints, but I am not getting answer. > > If you know why they are convenient, can you please explain me? That > is what I am asking. [ I posted some references that might help, but I posted them in the wrong thread :( ] The "empty sum" and "empty product" conventions are described in the corresponding articles in Wikipedia too - they might help: https://en.wikipedia.org/wiki/Empty_sum https://en.wikipedia.org/wiki/Empty_product Do not think of `(+ ...)' in Lisp as the (binary) addition operator: think of it as the sum operator (denoted Σ in math) which adds up a whole sequence of numbers. Similarly, think of `(* ...)' in Lisp as the product operator (denoted Π in math). It is more pre-calculus level math, rather than elementary school math. The conventions are useful in math because they simplify proofs, by eliminating special cases. The same conventions are useful in Lisp, because they make the Lisp operators behave similarly to the math operators, so everything that you know about them can translate directly to Lisp. That's the *whole* point: there is nothing more to it. -- Nick ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 16:29 ` Jean Louis 2023-01-17 16:43 ` tomas @ 2023-01-17 17:17 ` Michael Heerdegen 2023-01-17 17:26 ` Jean Louis 2023-01-17 18:04 ` Jean Louis 1 sibling, 2 replies; 149+ messages in thread From: Michael Heerdegen @ 2023-01-17 17:17 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > Every elementary school is there to prove that convention of having at > least two addends for addition and two factors for multiplication > exists. Ok... My neighbor has one garage with 2 Ferraris. Altogether he has (+ 2) ==> 2 Ferraris. Not an undefined number of Ferraris. So you see that extending the sum operator to one summand is natural and makes sense. I OTOH have no garage. The number of my Ferraris in all my garages is (+) -> 0 Ferraries. The count of my Ferraris in all of my garages is actually defined, as the number of my garages is. It is really 0, not undefined. I can't write to the tax office that the number of Ferraris in my garages is undefined because there are zero summands and thus I can't calculate the number. > By chance, I am providing roomt to mathematics teacher who was not > introduced to this discussion, and I just called him and asked him if > there is anything that he knows that in absence of factors, the > multiplication operation would yield with anything, and he has no idea > what we are talking about. This convention is not so useful in elementary school, at least not literally. And unfortunately, at least here in Germany, a lot of mathematics teachers don't understand math very well. But you might have learned that multiplication is repeated summation (I think I already gave this example a couple of times but never got a response): 2*9 = 9 + 9 (two summands) 1*9 = 9 (one summand) 0*9 = ??? (it's 0 at least) When it's allowed for `*' to handle cases that could be interpreted (!) as the sum of zero arguments, why should a _generalization_ of `+' not be allowed to? Note that adding things like Ferraris is only an _interpretation_ of a formula. A product with zero factors might not have a useful direct interpretation in the real world, but complex numbers also don't have, and that doesn't mean that it can't be useful to extend the formalisms that once were _inspired_ by things in the real world. What sum corresponds pi^2 to? So what you fail to see is that not everything in maths can be directly demonstrated using apples and pears. But that doesn't mean that it's not worth to include these parts of maths in programming languages. If you are really doing maths, or are really working with sums in programming, you'll see why and where these convention make sense. And in programming, it's a bit like with everything new you learn: you don't miss it before you get to know it. > What idea he has is that there must be 2 known factors for > multiplications and similar for addition. That doesn't mean that it can't be _extended_. Like the natural numbers can be extended to the whole numbers etc. It's generalization and abstraction. You don't learn all of that in elementary school. > That there may be some convention is not excluded, and that there is > identity element in mathematics is fine, but even the page of identity > element does not speak of creation of identity elements, but of usage > of identity elements. It's just not important enough, it's a little detail. Like in Elisp. It might sound super important and big to you right now but we are speaking about a tiny corner case all the time. We don't mention that (* 0 n) returns 0 in the docstring of `*', for example. > Then we have contradiction that description of functions `*' and `+' > and `-' does not speak of any sets or group theory. And we have people > speaking yes, group theory, sets. > > But not description of relation from sets to Lisp function, why? We have argument _lists_ that play the role of sets. > I am asking why is it in (some) Lisps? Because it's more convenient than raising an error. Examples had been outlined in this thread. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 17:17 ` Michael Heerdegen @ 2023-01-17 17:26 ` Jean Louis 2023-01-17 18:46 ` Michael Heerdegen 2023-01-17 18:04 ` Jean Louis 1 sibling, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-17 17:26 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-17 20:20]: > Jean Louis <bugs@gnu.support> writes: > > > Every elementary school is there to prove that convention of having at > > least two addends for addition and two factors for multiplication > > exists. > > Ok... > > My neighbor has one garage with 2 Ferraris. Altogether he has (+ 2) ==> > 2 Ferraris. Not an undefined number of Ferraris. So you see that > extending the sum operator to one summand is natural and makes sense. > > I OTOH have no garage. The number of my Ferraris in all my garages is > (+) -> 0 Ferraries. Don't add Ferraris, just multiply them and you will get one. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 17:26 ` Jean Louis @ 2023-01-17 18:46 ` Michael Heerdegen 2023-01-17 18:51 ` Jean Louis 0 siblings, 1 reply; 149+ messages in thread From: Michael Heerdegen @ 2023-01-17 18:46 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > > I OTOH have no garage. The number of my Ferraris in all my garages is > > (+) -> 0 Ferraries. > > Don't add Ferraris, just multiply them and you will get one. Note that when (+ 2 3) would yield 7 in Elisp, I would accept your "it's wrong" because there is a valid interpretation using Ferraris: (+ 2 3) should return the number of Ferraris of two sets of two and three Ferraris, and these are five Ferraris. But what calculation involving Ferraris would (*) correspond to? I don't see any interpretation of the formula that would apply to Ferraris, so it's not valid to say that a result of "one Ferrari" is wrong. What should that have calculated? Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 18:46 ` Michael Heerdegen @ 2023-01-17 18:51 ` Jean Louis 0 siblings, 0 replies; 149+ messages in thread From: Jean Louis @ 2023-01-17 18:51 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-17 21:48]: > Jean Louis <bugs@gnu.support> writes: > > > > I OTOH have no garage. The number of my Ferraris in all my garages is > > > (+) -> 0 Ferraries. > > > > Don't add Ferraris, just multiply them and you will get one. > > Note that when (+ 2 3) would yield 7 in Elisp, I would accept your "it's > wrong" because there is a valid interpretation using Ferraris: (+ 2 3) > should return the number of Ferraris of two sets of two and three > Ferraris, and these are five Ferraris. > But what calculation involving Ferraris would (*) correspond to? I > don't see any interpretation of the formula that would apply to > Ferraris, so it's not valid to say that a result of "one Ferrari" is > wrong. What should that have calculated? In absence of factors it should give error. That is my expectation. And not in absence of factors to give whole series of Ferraris: (+ (*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)(*)) ➜ 16 -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 17:17 ` Michael Heerdegen 2023-01-17 17:26 ` Jean Louis @ 2023-01-17 18:04 ` Jean Louis 2023-01-17 18:28 ` Eduardo Ochs 2023-01-17 19:18 ` Michael Heerdegen 1 sibling, 2 replies; 149+ messages in thread From: Jean Louis @ 2023-01-17 18:04 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-17 20:20]: > But you might have learned that multiplication is repeated summation (I > think I already gave this example a couple of times but never got a > response): > > > 2*9 = 9 + 9 (two summands) > 1*9 = 9 (one summand) > 0*9 = ??? (it's 0 at least) and how do you use represent that in Emacs Lisp? Though we actually speak of following * = 1 because it is absence of summands. Not presence. > When it's allowed for `*' to handle cases that could be interpreted (!) > as the sum of zero arguments, why should a _generalization_ of `+' not > be allowed to? Above sounds as capricious decision. I assume that Lisp makers who decided that (*) ➜ 1 did not have capricious decision, but they had something else in mind, something we did not yet mention here, and that something is what I am searching. > Note that adding things like Ferraris is only an _interpretation_ of > a formula. A product with zero factors might not have a useful > direct interpretation in the real world, but complex numbers also > don't have, and that doesn't mean that it can't be useful to extend > the formalisms that once were _inspired_ by things in the real > world. What sum corresponds pi^2 to? I don't really search for useful interpretation in real world, just in Emacs Lisp or similar, why is it useful in Lisp? Do you have mathematical exercise in Lisp that may demonstrate it usefulness? Is it only for representation purposes like Eduardo explained, something like: (* 2 2 2) ➜ 8 (* 2 2) ➜ 4 (* 2) ➜ 2 (*) ➜ 1 Do you think it is only for representation or consistency purposes? Or there is some actual use? > So what you fail to see is that not everything in maths can be > directly demonstrated using apples and pears. I don't fail to see that, because I know that 2 plus 2 is never 4, that is just absolute representation, and in reality (almost) not possible, as things like apples or Ferraris, chips, they are never same, we have to imagine that one thing is same to other for mathematics to work, as there is useful application of it. So no, that is not problem. What I do not see is why is it convenient in Lisp. > But that doesn't mean that it's not worth to include these parts of > maths in programming languages. OK I understand people in Common Lisp included it, and Emacs Lisp has it, and other Lisps. But why for example Emacs Lisp has (-) ➜ 0 but other Lisps not? Maybe in Emacs Lisp authors found some use for it? Or do they include it just because? Just because set theory, blah blah, so let us include it, but we see no reason for it. This is not believable. I believe there is some practical reason behind it. Reason that was not yet shown, but I feel it may be shown by somebody. > If you are really doing maths, or are really working with sums in > programming, you'll see why and where these convention make sense. I have no doubt for it. But show me use in Lisp as I do not ask about outside theories, but why is it included in Lisp. Is there example? > And in programming, it's a bit like with everything new you learn: > you don't miss it before you get to know it. It still remains mystery. > > What idea he has is that there must be 2 known factors for > > multiplications and similar for addition. > > That doesn't mean that it can't be _extended_. Like the natural numbers > can be extended to the whole numbers etc. It's generalization and > abstraction. You don't learn all of that in elementary school. Ok it has been extended. That is your conclusion. But why? Show me the use. > > That there may be some convention is not excluded, and that there is > > identity element in mathematics is fine, but even the page of identity > > element does not speak of creation of identity elements, but of usage > > of identity elements. > > It's just not important enough, it's a little detail. Like in Elisp. > It might sound super important and big to you right now but we are > speaking about a tiny corner case all the time. We don't mention that > (* 0 n) returns 0 in the docstring of `*', for example. I do not see above as analogous. I wish though. > > Then we have contradiction that description of functions `*' and `+' > > and `-' does not speak of any sets or group theory. And we have people > > speaking yes, group theory, sets. > > > > But not description of relation from sets to Lisp function, why? > > We have argument _lists_ that play the role of sets. > > > I am asking why is it in (some) Lisps? > > Because it's more convenient than raising an error. Examples had been > outlined in this thread. OK, maybe that, I would like to understand if that was really the reason of including it, the reason to minimize errors? I remember keyword "variadic functions", and by you telling me that reason is to minimize errors, then I searched and found following: http://www.google.com/search?hl=en-UG&source=hp&biw=&bih=&q=reason+for+variadic+functions+in+lisp+%22%28*%29%22&iflsig=AK50M_UAAAAAY8bsWwouJNovTEERdNcNKZHzCAJ9q4qm&gbv=2&oq=reason+for+variadic+functions+in+lisp+%22%28*%29%22&gs_l=heirloom-hp.3..0i546l3j0i30i546.87530.93919.0.94212.43.40.0.1.1.1.283.4416.20j15j5.40.0....0...1ac.1.34.heirloom-hp..16.27.2252.UY2UeNCa7OY I see one reference here: Lots of Insipid, Stupid Parentheses | by Ronie Uliana | Medium: https://ronie.medium.com/lots-of-insipid-stupid-parentheses-98f9b9510579 where it says: "Variadic arguments are even more interesting when we don’t pass any argument, like this: (+) <= this one gives us 0 (*) <= and this results in 1 Very handy because those are exactly the neutral elements for sum and product." But I can't see why is it handy, why it was added to Lisp to be handy. I heard so far it is convenient, handy, but not why is it convenient, no example where it shows its conveniency, and Picolisp example shows that `apply' can work perfectly well even if (*) ➜ NIL I can see here at this reference: Lots of Insipid, Stupid Parentheses | by Ronie Uliana | Medium: https://ronie.medium.com/lots-of-insipid-stupid-parentheses-98f9b9510579 > Variadic functions are functions that can take a variable number of > arguments. In C programming, a variadic function adds flexibility to > the program. It takes one fixed argument and then any number of > arguments can be passed. The variadic function consists of at least > one fixed variable and then an ellipsis(…) as the last parameter. That gives me to think that the sole purpose of making (*) ➜ 1 work in Lisp is to minimize errors, though I do not see the useful Lisp expression where such error is minimized. I wish to find it. The only useful case where I see that (*) will minimize errors is the function itself, by writing "(*)" so in that case it minimizes errors, so that demonstration is not enough. Is there any other case or Lisp expression where one can see that (*) is useful to minimize errors? I can think that such case is maybe every day easy to find, but so far none of participants mentioned it. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 18:04 ` Jean Louis @ 2023-01-17 18:28 ` Eduardo Ochs 2023-01-17 19:18 ` Michael Heerdegen 1 sibling, 0 replies; 149+ messages in thread From: Eduardo Ochs @ 2023-01-17 18:28 UTC (permalink / raw) To: Michael Heerdegen, help-gnu-emacs On Tue, 17 Jan 2023 at 15:05, Jean Louis <bugs@gnu.support> wrote: > Ok it has been extended. That is your conclusion. But why? Show me the use. Hi Jean, note that we are discussing several different operations called `+'... and sometimes to understand what a mathematical sentence "really means" we have to add annotations to these operations with the same name to distinguish them. The best explanation that I know about this is in the pages 15-20 of these slides: http://math.andrej.com/asset/data/the-dawn-of-formalized-mathematics.pdf#page=15 When I had to explain "neutral elements" to my students a few months ago I started by the operations "for all" and "exists". They understood very quickly that for any proposition P(x) we had: ∀x∈{2,3,5}.P(x) = P(2)∧P(3)∧P(5) ∃x∈{2,3,5}.P(x) = P(2)∨P(3)∨P(5) where "∧" is "and" and "∨" is "or", and these are the boolean "and" and "or", that only accept inputs that are truth-values, and the only truth-values are "true" and "false"... so these "∧" and "∨" are very different from the "and" and "or" from Lisp. Then at some point we started to meet expressions like these ones: ∀x∈{}.P(x) ∃x∈{}.P(x) In a first moment the students didn't know how to interpret them. I told them that this is one of the places in which mathematicians _decide_ to extend a known operation, and in which they _choose_ an extended definition that may look artificial at first - but they choose a definition that turns out to be more well-behaved that the other ones. For the "∀" we had (at least) these three possibilities: ∀x∈{}.P(x) = error ∀x∈{}.P(x) = false ∀x∈{}.P(x) = true and I showed to them why the mathematicians had decided that this one ∀x∈{}.P(x) = true would be the best choice. In my argument I used the figures that are here, http://angg.twu.net/LATEX/2022-2-C2-tudo.pdf#page=87 but these figures are not self-contained - I also talked a lot, wrote lots of things on the whiteboard, and gesticulated a lot. By the way, I started by "∀" and "∃" because I saw that it would be better to start by them and then do "Σ" and "Π" later. See: https://en.wikipedia.org/wiki/Summation#Capital-sigma_notation By the way: my main objective was to show to the students how definitions work, and how in some cases some definitions can be extended. "∀" and "∃" were just particular cases of this big idea, and the big idea itself was more important than its particular cases. Cheers, Eduardo ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 18:04 ` Jean Louis 2023-01-17 18:28 ` Eduardo Ochs @ 2023-01-17 19:18 ` Michael Heerdegen 2023-01-18 12:27 ` Jean Louis 1 sibling, 1 reply; 149+ messages in thread From: Michael Heerdegen @ 2023-01-17 19:18 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > Do you have mathematical exercise in Lisp that may demonstrate it > usefulness? > > Is it only for representation purposes like Eduardo explained, > something like: > > (* 2 2 2) ➜ 8 > (* 2 2) ➜ 4 > (* 2) ➜ 2 > (*) ➜ 1 > > Do you think it is only for representation or consistency purposes? Or > there is some actual use? The complete thing must be consistent, but anything must be consistent to avoid false results, consistence is not the purpose. The question of use is a valid one, we missed to answer it yet. It wasn't clear to me that this was part of what you are asking for. Ok, I'll try to give an example. You list your expenses in a form. On six pages. You write the sum of all expenses of any page on the bottom of the page to be able to calculate the final sum conveniently. But on page 5 there are no expenses at all. What do you write on the bottom of that page? You could write nothing, but then you might wonder if you have forgotten to fill out that page. You could also leave a special note "no expenses" - but in Lisp we don't have such special values that can be used in summation. So you just write "0" onto that page - the partial sum of no summands. That works because adding 0 doesn't change the final result (as adding zero summands to the final sum would) - it's the same in the case of summation: 0 is the "nothing" of addition. Likewise, 1 is the "nothing" of products and "" is the "nothing" of string `concat'enation, etc. This interpretation only makes sense when the result of (+), (*), (concat) appears as intermediate result in some other call of `+', `*', `concat'. By themselves the value is not always meaningful (0 as the value of the empty sum might be meaningful, 1 as result of an empty product less, the empty string as results of concatenating no strings -- depends). But it allows to avoid to treat the case of empty subsets specially. > OK I understand people in Common Lisp included it, and Emacs Lisp has > it, and other Lisps. But why for example Emacs Lisp has (-) ➜ 0 but > other Lisps not? That's also a valid question. (-) and (/) are questionable. `-' accepts one argument, so e.g. (- 7) ==> 7. (/ 7.0) is also interpreted as value of 1/7. I don't care about the results of (-) and (/), these are indeed a bit obscure IMO. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 19:18 ` Michael Heerdegen @ 2023-01-18 12:27 ` Jean Louis 2023-01-18 13:37 ` Michael Heerdegen ` (2 more replies) 0 siblings, 3 replies; 149+ messages in thread From: Jean Louis @ 2023-01-18 12:27 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-17 22:20]: > The question of use is a valid one, we missed to answer it yet. It > wasn't clear to me that this was part of what you are asking for. Yes, that one. Why authors decided to have (*) ➜ 1 which in case of me who could delete some argument like from (* tonnes quantity) I could by mistake delete "tonnes and quantity" and result of (*) would not be detected because there is no error -- while makers (authors) of which Lisp, as I do not know where did it start, maybe in Common Lisp, maybe in Emacs Lisp, why did they decide to include it? So let me read here: > You list your expenses in a form. On six pages. You write the sum of > all expenses of any page on the bottom of the page to be able to > calculate the final sum conveniently. > > But on page 5 there are no expenses at all. What do you write on the > bottom of that page? You could write nothing, but then you might wonder > if you have forgotten to fill out that page. You could also leave a > special note "no expenses" - but in Lisp we don't have such special > values that can be used in summation. So you just write "0" onto that > page - the partial sum of no summands. That works because adding 0 > doesn't change the final result (as adding zero summands to the final > sum would) - it's the same in the case of summation: 0 is the "nothing" > of addition. Writing zero is one thing, surely I understand above. I said that I did read the identity element article, and that articles does not speak of absence of elements! It speaks that identity element is the one when added to other elements, it does not change the result. We have here case of absence of elements, not presence of elements. I understand your practical example above, I can't see relation to Lisp where author made (*) to result with 1. Of course I understand that some people say ah, there is set theory and that is identity element, but practical use in multiplication or addition I still can't find. I got clue that having that identity element was maybe helpful in other programming language like C, and then somebody started placing it in Lisp arithmetic functions, where maybe it does not have any real use. I may be wrong, but research of variadic functions kind of gives me clue to that conclusion. > Likewise, 1 is the "nothing" of products and "" is the "nothing" of > string `concat'enation, etc. I can't see that 1 is nothing for produts, but I understand what you wish to say. If (*) ➜ 1 is "nothing", adding three "nothing" yields with 3: (+ (*) (*) (*)) ➜ 3 which can't be, as nothing added to nothing can't give more than nothing. However, I do understand what you wanted to say, just with different terms. > This interpretation only makes sense when the result of (+), (*), > (concat) appears as intermediate result in some other call of `+', > `*', `concat'. By themselves the value is not always meaningful (0 > as the value of the empty sum might be meaningful, 1 as result of an > empty product less, the empty string as results of concatenating no > strings -- depends). But it allows to avoid to treat the case of > empty subsets specially. I understand in Lisp context that various functions shall give me back result, to help me with programming. But I do not see why would (concat) ➜ "" not result with errors, I would like error there to be reminded that I forgot something. Maybe before programmer wish to write which strings are to be concatenated, one can use function temporarily for testing, like (let ((result (ignore)) (my (concat)))) my) and then later this function becomes something like: (let ((result (fetch-results)) (my (concat "Result is: " result)))) my) For (concat) I can see use case as placeholder for string, so that programmer can update the function. Otherwise I don't know. Do you know use case for (concat)? Some string functions I made I want them to give me empty string instead of nil, but for concat I don't know why I would want that, I want error. For (*) I have not find use. Maybe use is in that temporary programming moments, where programmer wish to add some numbers, but did not add them yet, like following: 1. Programmer thinks of variables A multiplied by B to be multiplied with C mutliplied by D 2. But writes without variables C and D: (* (* A B) (*)) 3. Then in next step adds C and D: (* (* A B) (* C D)) Was that use case or something else that justified creation of (*) ➜ 1 Or was it just capricious thinking: "Let me add identity element, it will look more like advanced mathematics" Or was it the reason that it was maybe copied from C language which I do not know, and which maybe got much more use of functions which yield 1 for multiplication without any elements? > > OK I understand people in Common Lisp included it, and Emacs Lisp has > > it, and other Lisps. But why for example Emacs Lisp has (-) ➜ 0 but > > other Lisps not? > > That's also a valid question. > > (-) and (/) are questionable. `-' accepts one argument, so e.g. (- 7) > ==> 7. (/ 7.0) is also interpreted as value of 1/7. > > I don't care about the results of (-) and (/), these are indeed a bit > obscure IMO. I understand you have no use for those, that is what maybe had some use somewhere. If you know C language, do you think that hypothesis that it simply came from C language, could be right? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 12:27 ` Jean Louis @ 2023-01-18 13:37 ` Michael Heerdegen 2023-01-19 8:20 ` Jean Louis 2023-01-18 13:57 ` Óscar Fuentes 2023-01-18 14:25 ` Michael Heerdegen 2 siblings, 1 reply; 149+ messages in thread From: Michael Heerdegen @ 2023-01-18 13:37 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > I can't see that 1 is nothing for produts, but I understand what you > wish to say. > > If (*) ➜ 1 is "nothing", adding three "nothing" yields with 3: > > (+ (*) (*) (*)) ➜ 3 You are still victim of a thinking error: you only think of counts of things, counts of cars, etc. But you can only _add_ counts of things, it makes no sense to multiply counts of things. Saying "I have no cars in my garage, but (*) ==> 1, so where is that car out of nothing?" is equally nonsense as saying "A has 2 cars and B has 3 cars, and (* 2 3) ==> 6, but together they have only 5 cars, so where is that car out of nothing?". Multiplication of quantities is not meaningful in this sense, it is the wrong operation, so there is no reason to question the result when interpreting the result as a count of objects. The following will be my last examples. What kind of stuff in the real world could be multiply? Maybe multiplication rates of money? Like, in year 1 you got 10 Percent interest on your investment. 3 percent in year 2. In year 3 you did not invest your money, you were ill all the time, or whatever. In year 4 you got 4 percent. The final interest is the product of interests in all years: 1.1 * 1.03 * 1 * 1.04 = 1.17832 So 17.832 percent in those 4 years. You could also leave out the third factor 1. But that might complicate your calculation unnecessarily. The factor in year 3 can be assigned a number, it can be measured, even when you "did nothing". It's like the 0 in sums: adding a factor 1 doesn't change the result, so it plays the role of "nothing". You did not get "1 money" in that year. That is a nonsense interpretation. Those factors are not things like cars. But they are useful for a calculation. It's a kind of abstraction. Another example: transmission rates in a microscope. Lenses attenuate the beam of light through the microscope. The final transmission rate is the product of transmission rates of the parts. Say every lens takes away 10 percent of the transmission rate. Say the objective A has 2 lenses, the middle part B no lenses, and the ocular 3 lenses, but two of those are special very expensive lenses that take away only 1 percent: The final transmission rate is (using Lisp syntax this time) rate_A * rate_B * rate_C = ((* 0.9 0.9) (*) (* 0.9 0.99 0.99)) = (* 0.81 1 0.88209) = 0.71449... So you loose approx. 28.5 percent of light across the microscope. That doesn't mean that the middle part adds a light beam or a microscope. These factors don't describe object counts. > Otherwise I don't know. Do you know use case for (concat)? Well, invent some, I think you are able to. We have to stop here or people get angry, this discussion has diverged away from Emacs. > Or was it just capricious thinking: "Let me add identity element, it > will look more like advanced mathematics" > > Or was it the reason that it was maybe copied from C language which I > do not know, and which maybe got much more use of functions which > yield 1 for multiplication without any elements? No, none of that. We are actually speaking about elementary maths, and this is a useful handling of a corner case. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 13:37 ` Michael Heerdegen @ 2023-01-19 8:20 ` Jean Louis 2023-01-19 10:06 ` Tassilo Horn 2023-01-19 13:43 ` Michael Heerdegen 0 siblings, 2 replies; 149+ messages in thread From: Jean Louis @ 2023-01-19 8:20 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-18 16:39]: > Jean Louis <bugs@gnu.support> writes: > > > I can't see that 1 is nothing for produts, but I understand what you > > wish to say. > > > > If (*) ➜ 1 is "nothing", adding three "nothing" yields with 3: > > > > (+ (*) (*) (*)) ➜ 3 > You are still victim of a thinking error: you only think of counts of > things, counts of cars, etc. But you can only _add_ counts of things, it > makes no sense to multiply counts of things. I am not the one trying to explain things. I look only at functions like: (+ (*) (*) (*)) ➜ 3 which do not result that mathematically shall be sum of three multiplications. It is error in programming language. Without trying to explain it, provide Lisp function where it is actually useful. Or otherwise, the research has shown so far: 1. nobody knows why is it useful in Lisp 2. various hypothesis have been tried out and tested. All with the attempt to justify how (*) ➜ 1 should be there, but none can find reason for (1), see aove. 3. there is no to me known piece of Emacs Lisp that would raise error if function `*' would be made to require two arguments, as this point (3) would lead to probable understanding of it. and 4. Function makes something out of nothing instead of raising error: (+ (*) (*) (*)) ➜ 3 > Saying "I have no cars in my garage, but (*) ==> 1, so where is that car > out of nothing?" Joke? It was joke. > The following will be my last examples. > > What kind of stuff in the real world could be multiply? Maybe > multiplication rates of money? World examples are not object I am searching. I am searching how to use (*) ➜ 1 in Lisp, and if there is no use, there is more use in raising the error, then for capricious reasons of set theory lovers spiting 1 as a result of multiplication of nothing. I really don't mind of various mathematical theories, there are many, but irrelevant stuff shall not be injected into simple multiplication. So far you cannot tell me how is (*) ➜ 1 relevant for programmer, that is what I am asking. Other stories in the world are only funny or interesting, they do not help with Lisp. > > Otherwise I don't know. Do you know use case for (concat)? > > Well, invent some, I think you are able to. We have to stop here or > people get angry, this discussion has diverged away from Emacs. Aha, the final conclusion is "it is there (*) ➜ 1" and please "don't talk" or "Gods will get angry". > > Or was it the reason that it was maybe copied from C language which I > > do not know, and which maybe got much more use of functions which > > yield 1 for multiplication without any elements? > > No, none of that. We are actually speaking about elementary maths, and > this is a useful handling of a corner case. And instead of all of explanations, how about showing me how is it useful? I have shown how it is not useful: (+ (*) (*) (*)) ➜ 3 Where is example of how it is useful? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 8:20 ` Jean Louis @ 2023-01-19 10:06 ` Tassilo Horn 2023-01-19 13:43 ` Michael Heerdegen 1 sibling, 0 replies; 149+ messages in thread From: Tassilo Horn @ 2023-01-19 10:06 UTC (permalink / raw) To: Jean Louis; +Cc: Michael Heerdegen, help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > I look only at functions like: > > (+ (*) (*) (*)) ➜ 3 > > which do not result that mathematically shall be sum of three > multiplications. (*) is 1 because 1 is the neutral element of multiplication. (+) is 0 because 0 is the neutral element of addition. > It is error in programming language. > > Without trying to explain it, provide Lisp function where it is > actually useful. > > Or otherwise, the research has shown so far: > > 1. nobody knows why is it useful in Lisp It's useful because you can (apply #'+ my-list-of-numbers) and get a correct result. > 2. various hypothesis have been tried out and tested. All with the > attempt to justify how (*) ➜ 1 should be there, but none can find > reason for (1), see aove. > > 3. there is no to me known piece of Emacs Lisp that would raise error > if function `*' would be made to require two arguments, as this > point (3) would lead to probable understanding of it. > > and > > 4. Function makes something out of nothing instead of raising error: > (+ (*) (*) (*)) ➜ 3 > >> Saying "I have no cars in my garage, but (*) ==> 1, so where is that >> car out of nothing?" > > Joke? It was joke. The sum of cars in your garage is (apply #'+ nil) => 0 which is absolutely correct. > (+ (*) (*) (*)) ➜ 3 > > Where is example of how it is useful? Well, replace + and * with `and' and `or' and you get the canonical disjunctive or conjunctive normal forms. And then you can use it with lists of nil/non-nil values and it will be logically correct even when an empty lists sneaks in which is essentially the constant t or nil in this context. Bye, Tassilo ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 8:20 ` Jean Louis 2023-01-19 10:06 ` Tassilo Horn @ 2023-01-19 13:43 ` Michael Heerdegen 2023-01-19 14:42 ` Jean Louis 1 sibling, 1 reply; 149+ messages in thread From: Michael Heerdegen @ 2023-01-19 13:43 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > Aha, the final conclusion is "it is there (*) ➜ 1" and please "don't > talk" or "Gods will get angry". Honestly - this is how you talk to people after we already spent, literally, hours of answering your questions? Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 13:43 ` Michael Heerdegen @ 2023-01-19 14:42 ` Jean Louis 2023-01-19 15:27 ` tomas 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-19 14:42 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-19 16:46]: > Jean Louis <bugs@gnu.support> writes: > > > Aha, the final conclusion is "it is there (*) ➜ 1" and please "don't > > talk" or "Gods will get angry". > > Honestly - this is how you talk to people after we already spent, > literally, hours of answering your questions? Well -- you are free to draw conclusions. We may go through encyclopedias and what, though answer to question why is it useful is unknown. When I say "useful" I wish to see that usefulness in Emacs Lisp. Or maybe if it's origin is in Common Lisp or MacLisp, I wish to understand from there. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 14:42 ` Jean Louis @ 2023-01-19 15:27 ` tomas 0 siblings, 0 replies; 149+ messages in thread From: tomas @ 2023-01-19 15:27 UTC (permalink / raw) To: help-gnu-emacs; +Cc: Michael Heerdegen [-- Attachment #1: Type: text/plain, Size: 1429 bytes --] On Thu, Jan 19, 2023 at 05:42:27PM +0300, Jean Louis wrote: > * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-19 16:46]: > > Jean Louis <bugs@gnu.support> writes: > > > > > Aha, the final conclusion is "it is there (*) ➜ 1" and please "don't > > > talk" or "Gods will get angry". > > > > Honestly - this is how you talk to people after we already spent, > > literally, hours of answering your questions? > > Well -- you are free to draw conclusions. We may go through > encyclopedias and what, though answer to question why is it useful is > unknown. > > When I say "useful" I wish to see that usefulness in Emacs Lisp. > > Or maybe if it's origin is in Common Lisp or MacLisp, I wish to > understand from there. MACLISP was one of the first LISPs around (way before Emacs, way before you or me saw a computer). Serve yourself: http://www.maclisp.info/ Specifically here: http://www.maclisp.info/pitmanual/number.html More specifically: http://www.maclisp.info/pitmanual/number.html#9.18 Those people did it this way... back in the 1970s because that's the was mathematicians brains work. If they get to design an n-ary addition or multiplication operator, /this/ is the way they'd do it. Emacs Lisp just inherited that. It was in LISP's "way of thinking" right from the beginning. Just because you don't like it it's not going to change. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 12:27 ` Jean Louis 2023-01-18 13:37 ` Michael Heerdegen @ 2023-01-18 13:57 ` Óscar Fuentes 2023-01-19 8:32 ` Jean Louis 2023-01-18 14:25 ` Michael Heerdegen 2 siblings, 1 reply; 149+ messages in thread From: Óscar Fuentes @ 2023-01-18 13:57 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-17 22:20]: >> The question of use is a valid one, we missed to answer it yet. It >> wasn't clear to me that this was part of what you are asking for. > > Yes, that one. > > Why authors decided to have (*) ➜ 1 which in case of me who could > delete some argument like from (* tonnes quantity) I could by mistake > delete "tonnes and quantity" and result of (*) would not be detected > because there is no error Throwing an error on this case is a reasonable possibility for the language designers, but instead they decided to extend * to zero and one arguments. Why? because it is convenient, because it makes possible to do things like (apply '* some-list) without caring about how many elements some-list has, which is handy when some-list comes from a place you don't control. As far as the extension of * is reasonable, it is nice to have, that's what the language designers thought. So what's the reasonable extension of * (the variadic function!) to zero arguments? Let's use some basic algebra: (apply '* (list a b)) == (apply '* (list 1 1 a b)) which is the same as: a * b == 1 * 1 * a * b remove b: a == 1 * 1 * a remove a: ? == 1 * 1 which the same as: (apply '* ()) == (apply '* (1 1)) or (*) == (* 1 1) So * applied to zero arguments shall be 1, because any other value would break the equality. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 13:57 ` Óscar Fuentes @ 2023-01-19 8:32 ` Jean Louis 2023-01-19 16:51 ` Óscar Fuentes 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-19 8:32 UTC (permalink / raw) To: Óscar Fuentes; +Cc: help-gnu-emacs * Óscar Fuentes <ofv@wanadoo.es> [2023-01-18 16:58]: > Jean Louis <bugs@gnu.support> writes: > > > * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-17 22:20]: > >> The question of use is a valid one, we missed to answer it yet. It > >> wasn't clear to me that this was part of what you are asking for. > > > > Yes, that one. > > > > Why authors decided to have (*) ➜ 1 which in case of me who could > > delete some argument like from (* tonnes quantity) I could by mistake > > delete "tonnes and quantity" and result of (*) would not be detected > > because there is no error > > Throwing an error on this case is a reasonable possibility for the > language designers, but instead they decided to extend * to zero and one > arguments. Why? because it is convenient, because it makes possible to > do things like (apply '* some-list) without caring about how many > elements some-list has, which is handy when some-list comes from a place > you don't control. That explanation sounds like neglect in programming. I have mentioned that PicoLisp can `apply' with (*) yielding NIL. Try it out. ~$ pil : (*) -> NIL : (+) -> NIL : (apply '* '(2 3)) -> 6 it means it is not really to give relief to other functions. And there is nothing wrong for apply to yell the error when arguments are missing to the function. If you have some reference to that reasoning that (*) is related to `apply' from language designer, let me know. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 8:32 ` Jean Louis @ 2023-01-19 16:51 ` Óscar Fuentes 2023-01-20 8:01 ` Jean Louis 0 siblings, 1 reply; 149+ messages in thread From: Óscar Fuentes @ 2023-01-19 16:51 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > * Óscar Fuentes <ofv@wanadoo.es> [2023-01-18 16:58]: >> Jean Louis <bugs@gnu.support> writes: >> >> > * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-17 22:20]: >> >> The question of use is a valid one, we missed to answer it yet. It >> >> wasn't clear to me that this was part of what you are asking for. >> > >> > Yes, that one. >> > >> > Why authors decided to have (*) ➜ 1 which in case of me who could >> > delete some argument like from (* tonnes quantity) I could by mistake >> > delete "tonnes and quantity" and result of (*) would not be detected >> > because there is no error >> >> Throwing an error on this case is a reasonable possibility for the >> language designers, but instead they decided to extend * to zero and one >> arguments. Why? because it is convenient, because it makes possible to >> do things like (apply '* some-list) without caring about how many >> elements some-list has, which is handy when some-list comes from a place >> you don't control. > > That explanation sounds like neglect in programming. That's your personal opinion. Quite a few programmers think that not using strict strongly-typed, statically-typed languages is irresponsible, and see, here we are dicussing Lisp. BTW, do you consider support for more than two arguments on + and * also a neglect in programming? > I have mentioned > that PicoLisp can `apply' with (*) yielding NIL. Try it out. The first thing written in PicoLisp's home page is: PicoLisp is quite different from other Lisps. So be wary when taking PicoLisp's behavior as a comparison point when discussing other Lisp implementations. > ~$ pil > : (*) > -> NIL > : (+) > -> NIL > : (apply '* '(2 3)) > -> 6 What's the output of (apply '* '()) in PicoLisp? > it means it is not really to give relief to other functions. And there > is nothing wrong for apply to yell the error when arguments are > missing to the function. > > If you have some reference to that reasoning that (*) is related to > `apply' from language designer, let me know. I have no such references, nor I need them: it is immediately obvious to me. BTW, I'll say this for the last time: In Elisp, + is not the binary addition operator. It is the summation operator (aka Σ) for finite sequences. In Elisp, * is not the binary multiplication operator. It is the product operator (aka Π) for finite sequences. Once you internalize this, things will be clearer. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 16:51 ` Óscar Fuentes @ 2023-01-20 8:01 ` Jean Louis 0 siblings, 0 replies; 149+ messages in thread From: Jean Louis @ 2023-01-20 8:01 UTC (permalink / raw) To: Óscar Fuentes; +Cc: help-gnu-emacs * Óscar Fuentes <ofv@wanadoo.es> [2023-01-19 19:53]: > > That explanation sounds like neglect in programming. > > That's your personal opinion. Quite a few programmers think that not > using strict strongly-typed, statically-typed languages is > irresponsible, and see, here we are dicussing Lisp. > > BTW, do you consider support for more than two arguments on + and * also > a neglect in programming? That is quite alright because: 2 + 3 + 4 = 2 * 3 * 4 = is just fine and useful for human. People add numbers, multiply numbers. What is also useful is when factor is missing, for debugger to raise the error. Multiplication with single argument like here: (* 4) ➜ 4 Should be prevented by simply resulting with that single argument, instead of trying to multiply what is not necessary. (let ((my-random-numbers (make-list (1+ (random 3)) (+ 2 (random 5))))) my-random-numbers) ➜ (4 4 4) ;; I do not know how to make better example for `plus' function which ;; require 2 addends (defun plus (addend-1 addend-2 &rest addends) (eval `(+ addend-1 addend-2 ,@addends))) (plus) -- error (plus 2) -- error (plus 2 2) ➜ 4 (plus 2 2 3) ➜ 7 Thus in some complex operation, programmer better test what arguments are given to `apply'. (let ((my-random-numbers (make-list (1+ (random 3)) (+ 2 (random 5))))) (prog2 (message "List: %s" my-random-numbers) (cond ((cadr my-random-numbers) (apply #'plus my-random-numbers)) ((car my-random-numbers) (car my-random-numbers)) (t (warn "Did not get 2 factors!"))))) ➜ 6 in cases where radnom number of factors is given to multiplication, it seem to me better to take care of arguments and not at all `apply' or `reduce' as that way programmer can hardly find out what was actually the case. The explanation that (*) is made only for programmers to minimize errors sounds rationalizing. I believe there is some use of (*) which is probably in some old book or sources of Lisp in first place. > > ~$ pil > > : (*) > > -> NIL > > : (+) > > -> NIL > > : (apply '* '(2 3)) > > -> 6 > > What's the output of > > (apply '* '()) > > in PicoLisp? Emacs ----- (apply '* '(2 2)) ➜ 4 (apply '* '()) ➜ 1 PicoLisp -------- (apply '* '(2 2)) ➜ 4 (apply '* '()) -> NIL That is my natural expectation. I find it useful to have NIL as that would raise my attention that I have not provided arguments to multiplication. > > If you have some reference to that reasoning that (*) is related to > > `apply' from language designer, let me know. > > I have no such references, nor I need them: it is immediately obvious to > me. > > BTW, I'll say this for the last time: > > In Elisp, + is not the binary addition operator. It is the summation > operator (aka Σ) for finite sequences. > > In Elisp, * is not the binary multiplication operator. It is the product > operator (aka Π) for finite sequences. > > Once you internalize this, things will be clearer. I understand your statement above as following: - in Elisp, there is no particular practical use for (*) ➜ 1 - there is theoretical only, and representativ use, as (*) ➜ 1 talks about summation for finite sequences -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 12:27 ` Jean Louis 2023-01-18 13:37 ` Michael Heerdegen 2023-01-18 13:57 ` Óscar Fuentes @ 2023-01-18 14:25 ` Michael Heerdegen 2023-01-19 8:34 ` Jean Louis 2 siblings, 1 reply; 149+ messages in thread From: Michael Heerdegen @ 2023-01-18 14:25 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > Otherwise I don't know. Do you know use case for (concat)? I have an idea for you: search for potential uses of calls of `*' and/or `concat' (and maybe more associative functions) with no arguments in the Emacs sources. They exist and rely on the functions returning the neutral argument and they are not really obscure. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 14:25 ` Michael Heerdegen @ 2023-01-19 8:34 ` Jean Louis 2023-01-19 13:54 ` Michael Heerdegen 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-19 8:34 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-18 17:26]: > Jean Louis <bugs@gnu.support> writes: > > > Otherwise I don't know. Do you know use case for (concat)? > > I have an idea for you: search for potential uses of calls of `*' and/or > `concat' (and maybe more associative functions) with no arguments in the > Emacs sources. They exist and rely on the functions returning the > neutral argument and they are not really obscure. Did you find it? If you did, let me know. I do not know how to find that. Do you wish to say that (concat) ➜ "" yields empty string and that (*) ➜ 1 yields number one only for reason that it becomes easier to Emacs developer to program in C language? In that case reasoning would be awkward. Or do you refer to Lisp? That is what I am searching. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 8:34 ` Jean Louis @ 2023-01-19 13:54 ` Michael Heerdegen 2023-01-19 14:54 ` Jean Louis 2023-01-19 17:44 ` [External] : " Drew Adams 0 siblings, 2 replies; 149+ messages in thread From: Michael Heerdegen @ 2023-01-19 13:54 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > Did you find it? If you did, let me know. I do not know how to find > that. Yes, I did. After approximately 1 minute for every function I tried. Believe it or not (I guess you don't believe it and add something weird to your list instead that nobody can...etc. instead of starting to invest your own time to really try to understand). And no, I will not search those examples for you and discuss them with you. They are trivial to find and trivial to understand after reading the things we explained. And I already anticipate your reaction: that that code is wrong and you expected different code. I'm out. Enough information has been presented to you to enable you to learn. But I cannot learn for you, you must do it yourself. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 13:54 ` Michael Heerdegen @ 2023-01-19 14:54 ` Jean Louis 2023-01-19 15:19 ` Tassilo Horn ` (2 more replies) 2023-01-19 17:44 ` [External] : " Drew Adams 1 sibling, 3 replies; 149+ messages in thread From: Jean Louis @ 2023-01-19 14:54 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-19 16:56]: > Jean Louis <bugs@gnu.support> writes: > > > Did you find it? If you did, let me know. I do not know how to find > > that. > > Yes, I did. After approximately 1 minute for every function I tried. > Believe it or not (I guess you don't believe it and add something weird > to your list instead that nobody can...etc. instead of starting to invest > your own time to really try to understand). You found examples I am searching, though you can't provide references where (*) is useful. And I said it is mystery made by Gods. Super beings who for unknown reasons know everything, and do what they want, without knowledge available for us human. 😉 Did you maybe find this in Emacs sources? -*- mode: grep; default-directory: "~/Programming/Software/emacs/" -*- Grep started at Thu Jan 19 17:44:12 find -H . -type d \( -path \*/SCCS -o -path \*/RCS -o -path \*/CVS -o -path \*/MCVS -o -path \*/.src -o -path \*/.svn -o -path \*/.git -o -path \*/.hg -o -path \*/.bzr -o -path \*/_MTN -o -path \*/_darcs -o -path \*/\{arch\} \) -prune -o \! -type d \( -name .\#\* -o -name \*.beam -o -name \*.vee -o -name \*.jam -o -name \*.o -o -name \*\~ -o -name \*.bin -o -name \*.lbin -o -name \*.so -o -name \*.a -o -name \*.ln -o -name \*.blg -o -name \*.bbl -o -name \*.elc -o -name \*.lof -o -name \*.glo -o -name \*.idx -o -name \*.lot -o -name \*.fmt -o -name \*.tfm -o -name \*.class -o -name \*.fas -o -name \*.lib -o -name \*.mem -o -name \*.x86f -o -name \*.sparcf -o -name \*.dfsl -o -name \*.pfsl -o -name \*.d64fsl -o -name \*.p64fsl -o -name \*.lx64fsl -o -name \*.lx32fsl -o -name \*.dx64fsl -o -name \*.dx32fsl -o -name \*.fx64fsl -o -name \*.fx32fsl -o -name \*.sx64fsl -o -name \*.sx32fsl -o -name \*.wx64fsl -o -name \*.wx32fsl -o -name \*.fasl -o -name \*.ufsl -o -name \*.fsl -o -name \*.dxl -o -name \*.lo -o -name \*.la -o -name \*.gmo -o -name \*.mo -o -name \*.toc -o -name \*.aux -o -name \*.cp -o -name \*.fn -o -name \*.ky -o -name \*.pg -o -name \*.tp -o -name \*.vr -o -name \*.cps -o -name \*.fns -o -name \*.kys -o -name \*.pgs -o -name \*.tps -o -name \*.vrs -o -name \*.pyc -o -name \*.pyo \) -prune -o -type f \( -iname \*.el \) -exec grep --color=auto -i -nH --null -e \"\(\\\*\)\" \{\} + ./lisp/progmodes/verilog-mode.el:9311: ;; To advance past either "(*)" or "(* ... *)" don't forward past first * ./lisp/progmodes/verilog-mode.el:9783: ;; To advance past either "(*)" or "(* ... *)" don't forward past first * ./lisp/progmodes/verilog-mode.el:9977: ;; To advance past either "(*)" or "(* ... *)" don't forward past first * ./lisp/wid-edit.el:2569: :on "(*)" ./lisp/international/latin1-disp.el:2319: (?\ "(*)") Grep finished with 5 matches found at Thu Jan 19 17:44:48 I was reading about macros on Reddit Why does lisp allow AND/OR operators to have 0 or 1 operands? : lisp: https://www.reddit.com/r/lisp/comments/p3o25t/comment/h8vru39/ And I found some example of macro, it seems only that it saves some time to programmer to write shorter macro rather than little longer macro https://www.reddit.com/r/lisp/comments/p3o25t/why_does_lisp_allow_andor_operators_to_have_0_or/h8vru39/?context=8&depth=9 But apart from similar mathematical explanations which do not lead to answer how is it useful to somebody in Lisp, I did not find enlightenment. I can read by "stylwarning" user: > It makes generalizing things easier and debugging easier. It also > follows the arithmetic functions like + and * which allow zero or > more arguments. I can't find useful Lisp expression of "generalizing easier" with (*) or "debugging easier" with (*). > Simple example: I can comment out parts of an ABD/OR while debugging > without having to rewrite the whole condition if I’m left with fewer > than 2 cases. That person indicates that the purpose would be temporary sketching of functions. Though that I cannot get confirmed. For any bug in programming language one could find some invented other purpose, why not. It does not mean that authors intended it for that purpose of sketching. > A more complex example would involve writing macros. Say I’m writing > a macro and I have an accumulated list of conditions CX I must > satisfy. It is nice to be able to write > `(and ,@cx) > and not the comparatively annoying > (cond > ((null cx) `t) > ((null (cdr cx)) (car cx)) > (t `(and ,@cx))) -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 14:54 ` Jean Louis @ 2023-01-19 15:19 ` Tassilo Horn 2023-01-19 15:46 ` Michael Heerdegen 2023-01-19 17:38 ` Dr Rainer Woitok 2 siblings, 0 replies; 149+ messages in thread From: Tassilo Horn @ 2023-01-19 15:19 UTC (permalink / raw) To: Jean Louis; +Cc: Michael Heerdegen, help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > You found examples I am searching, though you can't provide references > where (*) is useful. Gosh, Jean, of course nobody would literally write (*) but (apply #'* ...), and you'll find occurrences in emacs: --8<---------------cut here---------------start------------->8--- find -H . -type d \( -path \*/SCCS -o -path \*/RCS -o -path \*/CVS -o -path \*/MCVS -o -path \*/.src -o -path \*/.svn -o -path \*/.git -o -path \*/.hg -o -path \*/.bzr -o -path \*/_MTN -o -path \*/_darcs -o -path \*/\{arch\} \) -prune -o \! -type d \( -name .\#\* -o -name \*.out -o -name \*.synctex.gz -o -name \*.o -o -name \*\~ -o -name \*.bin -o -name \*.lbin -o -name \*.so -o -name \*.a -o -name \*.ln -o -name \*.blg -o -name \*.bbl -o -name \*.elc -o -name \*.lof -o -name \*.glo -o -name \*.idx -o -name \*.lot -o -name \*.fmt -o -name \*.tfm -o -name \*.class -o -name \*.fas -o -name \*.lib -o -name \*.mem -o -name \*.x86f -o -name \*.sparcf -o -name \*.dfsl -o -name \*.pfsl -o -name \*.d64fsl -o -name \*.p64fsl -o -name \*.lx64fsl -o -name \*.lx32fsl -o -name \*.dx64fsl -o -name \*.dx32fsl -o -name \*.fx64fsl -o -name \*.fx32fsl -o -name \*.sx64fsl -o -name \*.sx32fsl -o -name \*.wx64fsl -o -name \*.wx32fsl -o -name \*.fasl -o -name \*.ufsl -o -name \*.fsl -o -name \*.dxl -o -name \*.lo -o -name \*.la -o -name \*.gmo -o -name \*.mo -o -name \*.toc -o -name \*.aux -o -name \*.cp -o -name \*.fn -o -name \*.ky -o -name \*.pg -o -name \*.tp -o -name \*.vr -o -name \*.cps -o -name \*.fns -o -name \*.kys -o -name \*.pgs -o -name \*.tps -o -name \*.vrs -o -name \*.pyc -o -name \*.pyo \) -prune -o -type f \( -iname \*.el \) -exec grep --color=auto -i -nH --null -e \(apply\ \#\'\\\* \{\} + ./gnus/spam-stat.el:494: (prod (apply #'* probs)) ./gnus/spam-stat.el:496: (/ prod (+ prod (apply #'* (mapcar (lambda (x) (- 1 x)) ./org/org-plot.el:232: (apply #'* (org--plot/nice-frequency-pick weighted-factors)))) ./org/org-plot.el:259: (< (* (apply #'* f-pick) 2-val) 30)) ./org/org-plot.el:262: (< (* (apply #'* f-pick) 3-val) 30)) ./htmlfontify.el:1055: (let ((n (apply #'* m))) --8<---------------cut here---------------end--------------->8--- And even more with (apply #'+ ...): --8<---------------cut here---------------start------------->8--- find -H . -type d \( -path \*/SCCS -o -path \*/RCS -o -path \*/CVS -o -path \*/MCVS -o -path \*/.src -o -path \*/.svn -o -path \*/.git -o -path \*/.hg -o -path \*/.bzr -o -path \*/_MTN -o -path \*/_darcs -o -path \*/\{arch\} \) -prune -o \! -type d \( -name .\#\* -o -name \*.out -o -name \*.synctex.gz -o -name \*.o -o -name \*\~ -o -name \*.bin -o -name \*.lbin -o -name \*.so -o -name \*.a -o -name \*.ln -o -name \*.blg -o -name \*.bbl -o -name \*.elc -o -name \*.lof -o -name \*.glo -o -name \*.idx -o -name \*.lot -o -name \*.fmt -o -name \*.tfm -o -name \*.class -o -name \*.fas -o -name \*.lib -o -name \*.mem -o -name \*.x86f -o -name \*.sparcf -o -name \*.dfsl -o -name \*.pfsl -o -name \*.d64fsl -o -name \*.p64fsl -o -name \*.lx64fsl -o -name \*.lx32fsl -o -name \*.dx64fsl -o -name \*.dx32fsl -o -name \*.fx64fsl -o -name \*.fx32fsl -o -name \*.sx64fsl -o -name \*.sx32fsl -o -name \*.wx64fsl -o -name \*.wx32fsl -o -name \*.fasl -o -name \*.ufsl -o -name \*.fsl -o -name \*.dxl -o -name \*.lo -o -name \*.la -o -name \*.gmo -o -name \*.mo -o -name \*.toc -o -name \*.aux -o -name \*.cp -o -name \*.fn -o -name \*.ky -o -name \*.pg -o -name \*.tp -o -name \*.vr -o -name \*.cps -o -name \*.fns -o -name \*.kys -o -name \*.pgs -o -name \*.tps -o -name \*.vrs -o -name \*.pyc -o -name \*.pyo \) -prune -o -type f \( -iname \*.el \) -exec grep --color=auto -i -nH --null -e \(apply\ \#\'\+ \{\} + ./leim/quail/hangul.el:341: (if (zerop (apply #'+ (append hangul-queue nil))) ./leim/quail/hangul.el:353: (if (not (zerop (apply #'+ (append hangul-queue nil)))) ./net/newst-backend.el:2186: (apply #'+ ./net/imap.el:1810: (apply #'+ (mapcar #'imap-body-lines body))) ./net/shr.el:2350: (let ((extra (- (apply #'+ (append suggested-widths nil)) ./net/shr.el:2351: (apply #'+ (append widths nil)) ./treesit.el:2608: (eq 0 (apply #'+ (mapcar #'treesit-node-child-count children)))) ./textmodes/texinfmt.el:2044: (apply #'+ texinfo-multitable-width-list)))) ./gnus/gnus-picon.el:217: (setq len (apply #'+ (mapcar (lambda (x) ./gnus/gnus-cache.el:889: (apply #'+ entry) ./gnus/gnus-score.el:2560: (apply #'+ (mapcar ./gnus/gnus-sum.el:3836: (apply #'+ (mapcar ./gnus/gnus-sum.el:8840: (apply #'+ (mapcar #'gnus-summary-limit-children ./gnus/gnus-agent.el:4139: (apply #'+ entry) ./gnus/spam-stat.el:515: (apply #'+ scores)))) ./calendar/solar.el:753: (apply #'+ ./calendar/solar.el:941: (S (apply #'+ (mapcar (lambda(x) ./calendar/todo-mode.el:3697: (mapcar (lambda (i) (apply #'+ (mapcar (lambda (x) (aref (cdr x) i)) ./ses.el:625: ses--linewidth (apply #'+ -1 (mapcar #'1+ widths)) ./ses.el:4037: (apply #'+ (apply #'ses-delete-blanks args))) ./ses.el:4044: (/ (float (apply #'+ list)) (length list))) ./org/org-plot.el:246: (let* ((total-count (apply #'+ (mapcar #'cdr frequencies))) ./org/org-colview.el:1261: (format (or printf "%s") (apply #'+ (mapcar #'string-to-number values)))) ./org/org-colview.el:1265: (format "%.2f" (apply #'+ (mapcar #'string-to-number values)))) ./org/org-colview.el:1306: (/ (apply #'+ (mapcar #'string-to-number values)) ./org/org-colview.el:1324: (lambda (&rest values) (/ (apply #'+ values) (float (length values)))) ./org/org-colview.el:1340: (/ (apply #'+ (mapcar #'org-columns--age-to-minutes ages)) ./org/org-clock.el:2626: (total-time (apply #'+ (mapcar #'cadr tables))) ./minibuffer.el:2025: (apply #'+ (mapcar #'string-width s)) ./minibuffer.el:2068: (apply #'+ (mapcar #'string-width str)) ./pcomplete.el:943: (let* ((envpos (apply #'+ (mapcar #' length strings))) ./progmodes/cc-guess.el:368: (apply #'+ ./progmodes/sql.el:3639: (apply #'+ (mapcar (lambda (ch) (if (eq ch ?\n) 1 0)) ./progmodes/vhdl-mode.el:7480: (apply #'+ (mapcar #'vhdl-get-offset syntax))) ./obsolete/thumbs.el:207: (dirsize (apply #'+ (mapcar (lambda (x) (cadr x)) files-list)))) ./obsolete/landmark.el:1428: (apply #'+ ./emacs-lisp/memory-report.el:254: (apply #'+ ./emacs-lisp/bytecomp.el:4515: (let ((nvalues (apply #'+ (mapcar (lambda (case) (length (car case))) ./emacs-lisp/smie.el:2219: (cl-assert (= total (apply #'+ (mapcar #'cdr off-alist)))) --8<---------------cut here---------------end--------------->8--- It's totally sensible to be able to compute the product/sum of an arbitrary number of numbers. All these would need checks for non-empty lists or even lists of at least 2 numbers if + and * would require at least 1 or 2 arguments. Bye, Tassilo ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 14:54 ` Jean Louis 2023-01-19 15:19 ` Tassilo Horn @ 2023-01-19 15:46 ` Michael Heerdegen 2023-01-19 17:38 ` Dr Rainer Woitok 2 siblings, 0 replies; 149+ messages in thread From: Michael Heerdegen @ 2023-01-19 15:46 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > You found examples I am searching, though you can't provide > references where (*) is useful. I don't want to spend more time in this discussion. And please stop blaming me for "what I can" or what people can or can't. I just don't have fun in this discussion any more. Please just respect that. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 14:54 ` Jean Louis 2023-01-19 15:19 ` Tassilo Horn 2023-01-19 15:46 ` Michael Heerdegen @ 2023-01-19 17:38 ` Dr Rainer Woitok 2023-01-20 7:31 ` Jean Louis 2 siblings, 1 reply; 149+ messages in thread From: Dr Rainer Woitok @ 2023-01-19 17:38 UTC (permalink / raw) To: Jean Louis; +Cc: Michael Heerdegen, help-gnu-emacs Jean Louis, On Thursday, 2023-01-19 17:54:16 +0300, you wrote: > ... > You found examples I am searching, though you can't provide > references where (*) is useful. > > And I said it is mystery made by Gods. Super beings who for unknown > reasons know everything, and do what they want, without knowledge > available for us human. Sorry, I'm late in this discussion. And to explain why this has not to do with Gods but rather with simple mathematics, I need to know a little bit about your math knowledge. It's ok if you don't want to answer my questions, but then it doesn't make sense for me to continue explaining. Question 1: Do you know the meaning of "rising x to the power of n"? On paper this is written like so n x and in plenty of programming languages it's written as "x^n" or "x**n". If you are familiar with this concept, and if you want to continue this, simply reply to this mail. Sincerely, Rainer ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-19 17:38 ` Dr Rainer Woitok @ 2023-01-20 7:31 ` Jean Louis 2023-01-20 11:49 ` Dr Rainer Woitok 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-20 7:31 UTC (permalink / raw) To: Dr Rainer Woitok; +Cc: help-gnu-emacs * Dr Rainer Woitok <rainer.woitok@gmail.com> [2023-01-19 20:39]: > Sorry, I'm late in this discussion. And to explain why this has not to > do with Gods but rather with simple mathematics, I need to know a little > bit about your math knowledge. Thanks, though it is not related to my question. My question is related to why or how is it useful in Lisp. Apart from "minimizing error handling in some situation" or "sketching of programs" or "shortening of macros", can you demonstrate me how it is useful in Lisp? Let me demonstrate the vague use that was so far discovered: ------------------------------------------------------------ Example of sketching of program: -------------------------------- User thinks of list, but does not place it: (let ((my-factor-1 1) (my-factor-2 2) (my-factor-3 3) (my-factor-4 4)) (+ (*) (* my-factor-3 my-factor-4 ))) then in the next step user does place the elements: (let ((my-factor-1 1) (my-factor-2 2) (my-factor-3 3) (my-factor-4 4)) (+ (* my-factor-1 my-factor-2) (* my-factor-3 my-factor-4 ))) I can't say that above is good usage example, as in fact, programmer may forget that he wrote (*) and may get result without being warned that factors are missing. Example of minimizing errors: ----------------------------- (setq my-list '()) (apply #'* '(2 3 4)) ➜ 24 (apply #'* my-list) ➜ 1 However, in that case programmer could forget to put something in the list, and raising of error is more important for empty list or missing arguments, than just yielding 1. Minimizing errors means neglecting the function and unexpected results. Function `apply' and `reduce' can as well take any kind of functions that require zero or more arguments. When let us say a list has only single element and I wish to `apply' addition on such list, then I can just give that single element as result instead of running function on single list element. So that is matter of programming style and care. It does not really answer my question where is (*) useful. Missing example of macro minimization ------------------------------------- In that example programmer would write shorter macro when function does not require 2 factors and somewhat longer where function require two arguments. Example of fun with (*) ----------------------- (defun m (n) (let ((m)) (dotimes (b n) (setq m (cons "(*)" m))) (concat "(+" (string-join m) ")"))) (let ((first 1)) (insert "\n") (while (<= first 10) (let ((second 1)) (while (<= second 10) (insert "(*" (m first)(m second) ")\n") (setq second (1+ second))) (setq first (1+ first))))) Other example of fun with (*) ----------------------------- (+ (*) (*) (*) (*) (*) (*)) ➜ 6 Or maybe function was made for mathematics lovers? -------------------------------------------------- (*) ➜ 1 Just "because" we love mathematics. The unanswered question: ------------------------ Do you know the actual practical example in any Lisp which will show how (*) ➜ 1 is useful? I do not ask how there are some "laws" outside of Lisp and because of those laws somebody liked them and included in a function. That sounds capricious. To find useful function, we may find which program or function CANNOT be executed (with slight modification) if I would make multiplication to require 2 factors? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-20 7:31 ` Jean Louis @ 2023-01-20 11:49 ` Dr Rainer Woitok 0 siblings, 0 replies; 149+ messages in thread From: Dr Rainer Woitok @ 2023-01-20 11:49 UTC (permalink / raw) To: Jean Louis; +Cc: help-gnu-emacs Jean Louis, On Friday, 2023-01-20 10:31:36 +0300, you wrote: > ... > > I need to know a little > > bit about your math knowledge. > > Thanks, though it is not related to my question. > > My question is related to why or how is it useful in Lisp. Oh. Are you really going to say that an incorrect mathematical concept of arithmetic would be more useful in Lisp? Sincerely, Rainer ^ permalink raw reply [flat|nested] 149+ messages in thread
* RE: [External] : Re: (*) -> 1 2023-01-19 13:54 ` Michael Heerdegen 2023-01-19 14:54 ` Jean Louis @ 2023-01-19 17:44 ` Drew Adams 2023-01-19 21:29 ` Michael Heerdegen 1 sibling, 1 reply; 149+ messages in thread From: Drew Adams @ 2023-01-19 17:44 UTC (permalink / raw) To: Michael Heerdegen, help-gnu-emacs@gnu.org > I'm out. Enough information has been > presented to you to enable you to learn. > But I cannot learn for you, you must do > it yourself. > Michael. Bingo. Ditto. Shoulda just considered it as trolling perhaps. In any case, shoulda stopped trying to help long ago. Gave the benefit of the doubt; wasted time helping. Maybe Dunning-Kruger? Whatever. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: (*) -> 1 2023-01-19 17:44 ` [External] : " Drew Adams @ 2023-01-19 21:29 ` Michael Heerdegen 2023-01-20 7:40 ` Jean Louis 0 siblings, 1 reply; 149+ messages in thread From: Michael Heerdegen @ 2023-01-19 21:29 UTC (permalink / raw) To: Drew Adams; +Cc: help-gnu-emacs@gnu.org Drew Adams <drew.adams@oracle.com> writes: > Bingo. Ditto. Shoulda just considered it > as trolling perhaps. In any case, shoulda > stopped trying to help long ago. Gave the > benefit of the doubt; wasted time helping. > Maybe Dunning-Kruger? Whatever. Exactly my thoughts. This was really grotesque. He just didn't even recognize how much energy people invested trying to help. Or maybe he was just waiting for someone saying he is right instead of caring about other answers. Eli had the right intuition. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: (*) -> 1 2023-01-19 21:29 ` Michael Heerdegen @ 2023-01-20 7:40 ` Jean Louis 2023-01-20 8:47 ` Emanuel Berg 0 siblings, 1 reply; 149+ messages in thread From: Jean Louis @ 2023-01-20 7:40 UTC (permalink / raw) To: Michael Heerdegen; +Cc: Drew Adams, help-gnu-emacs@gnu.org * Michael Heerdegen <michael_heerdegen@web.de> [2023-01-20 00:31]: > Drew Adams <drew.adams@oracle.com> writes: > > > Bingo. Ditto. Shoulda just considered it > > as trolling perhaps. In any case, shoulda > > stopped trying to help long ago. Gave the > > benefit of the doubt; wasted time helping. > > Maybe Dunning-Kruger? Whatever. > > Exactly my thoughts. This was really grotesque. He just didn't even > recognize how much energy people invested trying to help. Or maybe he > was just waiting for someone saying he is right instead of caring about > other answers. And now because you have not found use in Lisp, which I still believe must exist, or could exist in some early Lisp, all what you are left is to go with the mob and participate in profanities. I did not ask neither force you, or hired you, to give me X number of mathematical theories. I have asked how is that useful in Lisp. Because I can also make a function like (defun i-like-it () (message "i-like-it")) and claim that it is alright to result with "I like it" because I like it. However, that does not have practical use for people. And that is the foundation of my question, no matter how much Lisp authors liked mathematics. You participate voluntary in conversation. It is not employment. You do not need to participate in any conversation. I am not waiting for anybody to tell me how I am wrong, or right. I want to understand what was meant with making (*) ➜ 1 in the first place. So far I can only see that set theory is included because it exists, and because somebody liked it, or was thinking it should be so. I cannot see the practical use of it. You could as well tell "I do not know any practical use of it", and leave out of conversation. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: [External] : Re: (*) -> 1 2023-01-20 7:40 ` Jean Louis @ 2023-01-20 8:47 ` Emanuel Berg 0 siblings, 0 replies; 149+ messages in thread From: Emanuel Berg @ 2023-01-20 8:47 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: > You participate voluntary in conversation. It is not > employment. You do not need to participate in > any conversation. ... what do you mean, I'm not getting paid either? > I want to understand what was meant with making (*) → 1 in > the first place. So it can be used when there sometimes is nothing to use it on, and the end result won't be ruined but that occasion. -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-17 15:56 ` Michael Heerdegen 2023-01-17 16:29 ` Jean Louis @ 2023-01-18 9:02 ` Anders Munch 2023-01-18 10:49 ` Michael Heerdegen 2023-01-18 12:48 ` Eli Zaretskii 1 sibling, 2 replies; 149+ messages in thread From: Anders Munch @ 2023-01-18 9:02 UTC (permalink / raw) To: help-gnu-emacs@gnu.org Michael Heerdegen: >> Jean Louis: .. > Sorry to be direct like this, but what you are doing had been quite unfriendly for a while now. Being the only one who holds an opinion is not an unfriendly act. The thread goes on because so many other people feel they ought to be able to convince him. Just make peace with the idea that you won't convince him, and any perceived unfriendliness will stop. > You don't listen to [...] what people write. And the people who keep making analogies, instead of focusing on the Lisp functions, are not listening to what Jean Louis writes. The thread seems perfectly courteous to me, but if you must critique the tone, try applying the same critical eye to the people that you agree with. > You don't [...] understand what people write. Not understanding is not an unfriendly act. regards, Anders ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 9:02 ` Anders Munch @ 2023-01-18 10:49 ` Michael Heerdegen 2023-01-18 11:10 ` Emanuel Berg 2023-01-18 12:48 ` Eli Zaretskii 1 sibling, 1 reply; 149+ messages in thread From: Michael Heerdegen @ 2023-01-18 10:49 UTC (permalink / raw) To: help-gnu-emacs Anders Munch <ajm@flonidan.dk> writes: > > You don't [...] understand what people write. > Not understanding is not an unfriendly act. Not trying to would be. I got the impression he didn't try and got angry. Maybe I was wrong, then I'm sorry. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 10:49 ` Michael Heerdegen @ 2023-01-18 11:10 ` Emanuel Berg 0 siblings, 0 replies; 149+ messages in thread From: Emanuel Berg @ 2023-01-18 11:10 UTC (permalink / raw) To: help-gnu-emacs Michael Heerdegen wrote: >>> You don't [...] understand what people write. >> >> Not understanding is not an unfriendly act. > > Not trying to would be. I got the impression he didn't try > and got angry. Maybe I was wrong, then I'm sorry. It's OK ... -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 9:02 ` Anders Munch 2023-01-18 10:49 ` Michael Heerdegen @ 2023-01-18 12:48 ` Eli Zaretskii 2023-01-18 14:29 ` Michael Heerdegen 1 sibling, 1 reply; 149+ messages in thread From: Eli Zaretskii @ 2023-01-18 12:48 UTC (permalink / raw) To: help-gnu-emacs > From: Anders Munch <ajm@flonidan.dk> > Date: Wed, 18 Jan 2023 09:02:11 +0000 > > Just make peace with the idea that you won't convince him, and any perceived unfriendliness will stop. This whole thread should have moved to emacs-tangents long ago. ^ permalink raw reply [flat|nested] 149+ messages in thread
* Re: (*) -> 1 2023-01-18 12:48 ` Eli Zaretskii @ 2023-01-18 14:29 ` Michael Heerdegen 0 siblings, 0 replies; 149+ messages in thread From: Michael Heerdegen @ 2023-01-18 14:29 UTC (permalink / raw) To: help-gnu-emacs Eli Zaretskii <eliz@gnu.org> writes: > This whole thread should have moved to emacs-tangents long ago. The thread is partly about the interpretation and understanding of a mathematical operation. But it is also a question about Elisp and it's usage, and understanding existing Elisp code, it matters in practice, so emacs-help does not seem wrong to me. It's also not wrong IMO to have these answers in the archives, others may have the same question, and understanding the background helps to remember the conventions. That's why I continued debating here. Michael. ^ permalink raw reply [flat|nested] 149+ messages in thread
[parent not found: <87k01lica7.fsf@eder.anydns.info>]
* (*) -> 1 [not found] ` <87k01lica7.fsf@eder.anydns.info> @ 2023-01-17 16:04 ` Jean Louis 0 siblings, 0 replies; 149+ messages in thread From: Jean Louis @ 2023-01-17 16:04 UTC (permalink / raw) To: Andreas Eder; +Cc: help-gnu-emacs * Andreas Eder <a_eder_muc@web.de> [2023-01-17 15:20]: > > For now vague purpose is only to satisfy some other functions which > > process lists, like `reduce' or `apply', I am searching for > > confirmation if that was the sole purpose. > > The purpose is to be consistent in a mathematical sense. > There empty products are 1 and empty sums are 0. That is the only to > sensibly define it and to fulfill the associative property of the > operations. There are different contexts: - mathematical sense whereby "+" always require addends, without it, there is nothing to add. A number like zero is alright, but it must be there. - in lisp no addend is needed to yield (+) ➜ 0 - there is convention of identity elements, fine, but I do not see relation to above, neither why is one convention nullified in favor of the other convention Then we have: - mathematical sense whereby "*" always require 2 factos, without it, there is nothing to multiply. That is also convention. - in lisp no factor is needed to yield (*) ➜ 1 - because some other convention is followed nullyfing the previously explained one. Still I have not find clear relation why is it so. It is definitely not in every Lisp that way. PicoLisp does not think so: $ pil : (+) -> NIL : (*) -> NIL and it handles properly function `apply' without having (+) ➜ 0: ---------------------------------------------------------------- : (apply '+ '(1 2 3 4)) -> 10 (apply '* '(1 2 3 4)) -> 24 Emacs Lisp: (-) ➜ 0 but Guile: -) ice-9/boot-9.scm:1685:16: In procedure raise-exception: Wrong number of arguments to - So there are differences and the question is still open why is Lisp using those identity elements. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 149+ messages in thread
end of thread, other threads:[~2023-02-11 10:54 UTC | newest] Thread overview: 149+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-01-07 20:53 How to make M-x TAB not work on (interactive) declaration? Jean Louis 2023-01-07 21:11 ` Ruijie Yu via Users list for the GNU Emacs text editor 2023-01-07 23:40 ` Jean Louis 2023-01-08 6:06 ` Eli Zaretskii 2023-01-08 6:19 ` Emanuel Berg 2023-01-09 4:49 ` Jean Louis 2023-01-09 6:26 ` algorithmic Lisp language (was: Re: How to make M-x TAB not work on (interactive) declaration?) Emanuel Berg 2023-01-09 19:30 ` Jean Louis 2023-01-09 19:32 ` Jean Louis 2023-01-08 6:21 ` How to make M-x TAB not work on (interactive) declaration? Jean Louis 2023-01-08 6:32 ` Emanuel Berg 2023-01-08 10:38 ` Eli Zaretskii 2023-01-08 8:34 ` Tassilo Horn 2023-01-08 11:01 ` Eli Zaretskii 2023-01-09 13:29 ` Tassilo Horn 2023-01-08 21:35 ` Jean Louis 2023-01-08 22:35 ` [External] : " Drew Adams 2023-01-09 0:24 ` Emanuel Berg 2023-01-09 19:47 ` Jean Louis 2023-01-10 23:28 ` Emanuel Berg 2023-01-13 6:21 ` (*)->1 Jean Louis 2023-01-14 12:03 ` (*)->1 Michael Heerdegen 2023-01-14 12:33 ` (*)->1 Michael Heerdegen 2023-01-15 20:18 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Rudolf Adamkovič 2023-01-15 20:57 ` Jean Louis 2023-01-15 22:33 ` Drew Adams 2023-01-15 23:10 ` Emanuel Berg 2023-01-16 15:28 ` Jean Louis 2023-01-16 17:07 ` Drew Adams 2023-01-16 18:25 ` Jean Louis 2023-01-17 2:20 ` Drew Adams 2023-01-17 5:28 ` tomas 2023-01-17 22:20 ` Drew Adams 2023-01-18 5:14 ` tomas 2023-01-18 5:26 ` Emanuel Berg 2023-01-19 11:38 ` tomas 2023-01-19 11:51 ` Emanuel Berg 2023-01-21 14:05 ` tomas 2023-01-23 10:14 ` Robert Pluim 2023-01-23 16:44 ` Michael Heerdegen 2023-01-23 19:28 ` tomas 2023-01-18 17:27 ` Drew Adams 2023-01-18 17:32 ` tomas 2023-01-18 14:32 ` Jean Louis 2023-01-18 20:36 ` Drew Adams 2023-01-19 9:05 ` (*) -> 1 Jean Louis 2023-01-19 9:41 ` Yuri Khan 2023-01-19 12:52 ` Anders Munch 2023-01-17 5:35 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Jean Louis 2023-01-17 15:59 ` Yuri Khan 2023-01-17 16:42 ` Jean Louis 2023-01-17 16:05 ` Michael Heerdegen 2023-01-17 16:17 ` Yuri Khan 2023-01-17 16:25 ` tomas 2023-01-17 16:55 ` (*) -> 1 Jean Louis 2023-01-17 17:52 ` Michael Heerdegen 2023-01-17 18:11 ` Óscar Fuentes 2023-01-17 18:40 ` Jean Louis 2023-01-17 19:04 ` Óscar Fuentes 2023-01-18 13:15 ` Jean Louis 2023-01-18 14:37 ` Óscar Fuentes 2023-01-18 18:17 ` [External] : " Drew Adams 2023-01-17 19:35 ` Michael Heerdegen 2023-01-17 21:12 ` Michael Heerdegen 2023-01-17 22:01 ` Óscar Fuentes 2023-01-17 23:38 ` Michael Heerdegen 2023-01-18 7:50 ` Óscar Fuentes 2023-01-18 8:37 ` tomas 2023-01-18 12:46 ` Óscar Fuentes 2023-01-18 13:44 ` Michael Heerdegen 2023-01-18 14:07 ` Óscar Fuentes 2023-01-18 16:19 ` Andreas Eder 2023-01-18 17:14 ` Óscar Fuentes 2023-01-17 18:18 ` Jean Louis 2023-01-17 11:52 ` [External] : Re: How to make M-x TAB not work on (interactive) declaration? Michael Heerdegen 2023-01-15 21:08 ` Jean Louis 2023-01-16 5:02 ` Emanuel Berg 2023-01-16 5:38 ` tomas 2023-01-16 10:10 ` Jean Louis 2023-01-16 10:41 ` Yuri Khan 2023-01-16 15:26 ` Jean Louis 2023-01-17 4:06 ` Emanuel Berg 2023-01-17 14:00 ` tomas 2023-01-17 22:43 ` Emanuel Berg 2023-01-17 16:25 ` Nick Dokos 2023-01-17 17:19 ` Jean Louis 2023-02-11 4:38 ` Ruijie Yu via Users list for the GNU Emacs text editor 2023-02-11 10:54 ` Jean Louis 2023-01-17 17:41 ` Nick Dokos 2023-01-16 7:55 ` Yuri Khan 2023-01-16 10:16 ` Jean Louis 2023-01-16 10:37 ` Yuri Khan 2023-01-16 15:35 ` Jean Louis 2023-01-16 15:59 ` Yuri Khan 2023-01-16 16:14 ` Jean Louis 2023-01-16 16:47 ` tomas 2023-01-16 17:07 ` Drew Adams 2023-01-16 18:41 ` Jean Louis 2023-01-16 10:51 ` Anders Munch 2023-01-16 15:38 ` Jean Louis 2023-01-16 17:40 ` Andreas Eder 2023-01-16 18:17 ` tomas 2023-01-16 18:55 ` Jean Louis 2023-01-16 19:14 ` tomas 2023-01-16 18:46 ` Jean Louis 2023-01-17 2:37 ` Eduardo Ochs 2023-01-17 5:46 ` (*) -> 1 Jean Louis 2023-01-17 15:56 ` Michael Heerdegen 2023-01-17 16:29 ` Jean Louis 2023-01-17 16:43 ` tomas 2023-01-17 17:25 ` Jean Louis 2023-01-17 19:11 ` Nick Dokos 2023-01-17 17:17 ` Michael Heerdegen 2023-01-17 17:26 ` Jean Louis 2023-01-17 18:46 ` Michael Heerdegen 2023-01-17 18:51 ` Jean Louis 2023-01-17 18:04 ` Jean Louis 2023-01-17 18:28 ` Eduardo Ochs 2023-01-17 19:18 ` Michael Heerdegen 2023-01-18 12:27 ` Jean Louis 2023-01-18 13:37 ` Michael Heerdegen 2023-01-19 8:20 ` Jean Louis 2023-01-19 10:06 ` Tassilo Horn 2023-01-19 13:43 ` Michael Heerdegen 2023-01-19 14:42 ` Jean Louis 2023-01-19 15:27 ` tomas 2023-01-18 13:57 ` Óscar Fuentes 2023-01-19 8:32 ` Jean Louis 2023-01-19 16:51 ` Óscar Fuentes 2023-01-20 8:01 ` Jean Louis 2023-01-18 14:25 ` Michael Heerdegen 2023-01-19 8:34 ` Jean Louis 2023-01-19 13:54 ` Michael Heerdegen 2023-01-19 14:54 ` Jean Louis 2023-01-19 15:19 ` Tassilo Horn 2023-01-19 15:46 ` Michael Heerdegen 2023-01-19 17:38 ` Dr Rainer Woitok 2023-01-20 7:31 ` Jean Louis 2023-01-20 11:49 ` Dr Rainer Woitok 2023-01-19 17:44 ` [External] : " Drew Adams 2023-01-19 21:29 ` Michael Heerdegen 2023-01-20 7:40 ` Jean Louis 2023-01-20 8:47 ` Emanuel Berg 2023-01-18 9:02 ` Anders Munch 2023-01-18 10:49 ` Michael Heerdegen 2023-01-18 11:10 ` Emanuel Berg 2023-01-18 12:48 ` Eli Zaretskii 2023-01-18 14:29 ` Michael Heerdegen [not found] ` <87k01lica7.fsf@eder.anydns.info> 2023-01-17 16:04 ` Jean Louis
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).