Re: Re: [Axiom-developer] Summing over a list

"Bill Page" <[email protected]>
Newsgroups gmane.comp.mathematics.axiom.general
Message-ID <[email protected]>
Quoting Martin Rubey:

>
> (redirecting to axiom-math, where usage questions belong)
>
> Alasdair McAndrew writes:
>
>> Given two lists,for example:
>>
>> z:=[1,2,3,4,5,6]
>> w:=[1,0,0,1,1,1]
>>
>> it seems that the sum of the pairwise product is obtained by
>>
>> reduce(+,[z.i*w.i for i in 1..6])3B
> ... 
>> which is all very well.  But why doesn't
>>
>> sum(z.i*w.i,i=1..6)
>>
>> work?  I mean, sum(i^2,i=1..6) is fine. 
> ... 
> Short explanation: unlike Mma or Maple, in axiom evaluation is
> extremely simple: first the arguments are evaluated, then the
> function.  So, in your case, first axiom tries to evaluate
>
>   z.i*w.i
>
> and
>
>   i=1..6
>
> but there is no operation elt (which the dot is syntactig sugar
> for)  that takes a list and a symbol -- try to type z.i into the
> interpreter!  To make things clearer, note that there *is* an
> operation "=" that takes a symbol and a segment. 
>

As I mentioned in another thread on macros in Lisp, there
is a possible way to write the 'sum' operation in Axiom that
avoids this "premature evaluation" by using macros in Spad
or the interpreter:

(1) -> macro Sum(x, j,z) == reduce(+,[x for j in z])
                                                       Type: Void

\(2) -> z:=[1,2,3,4,5,6]

    (2)  [1,2,3,4,5,6]
                                   Type: List PositiveInteger

(3) -> w:=[1,0,0,1,1,1]

    (3)  [1,0,0,1,1,1]
                             Type: List NonNegativeInteger

(4) -> Sum(z.i*w.i, i,1..6)

    (4)  16
                                          Type: PositiveInteger

-------

I would really like to write it like this:

(5) -> macro Sum(x,z) == reduce(+,[x for variable(z) in segment(z)])

   Line   1: macro Sum(x,z) == reduce(+,[x for variable(z) in segment(z)])
            ..........................................A
   Error  A: syntax error at top level
   Error  A: Possibly missing a IN
    2 error(s) parsing

So then I could have written:

   Sum(z.i*w.i,i=1..6)

but Axiom's parser seems a little too strict. I think this
also illustrates a point about Lisp macros that would
presumably allow me to write such a thing (syntax not
withstanding). Maybe something like this?

(5) -> macro Sum(x,z) == (local j; j=:variable(z); _
            reduce(+,[x for j in segment(z)]))
                                                              Type: Void

(6) -> Sum(z.i*w.i , i=1..6)

    There are no library operations named :
       Use HyperDoc Browse or issue
                                   )what op:
       to learn if there is any operation containing ": " in its name. 

    Cannot find a definition or applicable library operation named :
       with argument type(s)
                                    Symbol

       Perhaps you should use "@" to indicate the required return type,
       or "$" to specify which version of the function you need. 

-----

But Axiom's interpreter seems to choke on it. :-(

Regards,
Bill Page.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.