help-gnu-emacs
[Top][All Lists]
Advanced

[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.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]