[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: (*) -> 1
From: |
Óscar Fuentes |
Subject: |
Re: (*) -> 1 |
Date: |
Wed, 18 Jan 2023 15:37:26 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) |
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.
- Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration?, (continued)
- Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration?, Jean Louis, 2023/01/17
- Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration?, Michael Heerdegen, 2023/01/17
- Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration?, Yuri Khan, 2023/01/17
- Re: [External] : Re: How to make M-x TAB not work on (interactive) declaration?, tomas, 2023/01/17
- Re: (*) -> 1, Jean Louis, 2023/01/17
- Re: (*) -> 1, Michael Heerdegen, 2023/01/17
- Re: (*) -> 1, Óscar Fuentes, 2023/01/17
- Re: (*) -> 1, Jean Louis, 2023/01/17
- Re: (*) -> 1, Óscar Fuentes, 2023/01/17
- Re: (*) -> 1, Jean Louis, 2023/01/18
- Re: (*) -> 1,
Óscar Fuentes <=
- RE: [External] : Re: (*) -> 1, Drew Adams, 2023/01/18
- Re: (*) -> 1, Michael Heerdegen, 2023/01/17
- Re: (*) -> 1, Michael Heerdegen, 2023/01/17
- Re: (*) -> 1, Óscar Fuentes, 2023/01/17
- Re: (*) -> 1, Michael Heerdegen, 2023/01/17
- Re: (*) -> 1, Óscar Fuentes, 2023/01/18
- Re: (*) -> 1, tomas, 2023/01/18
- Re: (*) -> 1, Óscar Fuentes, 2023/01/18
- Re: (*) -> 1, Michael Heerdegen, 2023/01/18
- Re: (*) -> 1, Óscar Fuentes, 2023/01/18