[Aldor-l] [Axiom-developer] spad: language and compiler
Ralf Hemmecke
ralf at hemmecke.de
Wed Aug 30 19:05:18 EDT 2006
Dear William,
> Getting back to your question, it is up to the programmer to define
> the bracket function for the domain where Martin's expression lives.
> Even though it may not be possible in Axiom to directly program
> tuples of heterogeneous domains, such tuples are present in most
> function signatures like foo:(INT, Boolean)->INT. I would expect
> Aldor therefore to be able to directly program tuples of
> heterogeneous domains.
As you know Record and Cross are two ways in Aldor to construct
heterogeneous tuples. The problem is that both must have a certain fixed
length when you write them into your program.
> Thus Martin's expression, perhaps using round parentheses instead of
> brackets, should work in Aldor.
Martin's line contained a "for n in primes(1,100)" iterator, so the type
would only be know if the compiler were able to evaluate "primes(1,100)"
at compile time.
> I don't know how "primes" is implemented but it is probably a
> built-in using both a table for lower range and some sophisticated
> algorithms for higher ones.
Whatever "built-in" means for you. It is certainly not built into the
Aldor language, it is part of a library and as such it could mean
anything I like.
> I am not suggesting compile time
> evaluation be extended to all static computations, but my guess is
> "primes" is special. A bit of compiler optimization would probably
> evaluate expressions like 2+3, so why not primes(1,100)?
To what should 2+3 evaluate? To the Integer 5? To the MachineInteger 5?
To a sparse univariate polynomial 5? To 0 mod 5? It is awfully ambiguous
and would in general involve more than just a call to the addition of
machine size integers. I could have even overloaded + for
MachineInteger. I guess, optimizing 2+3 to 5 is not even correct in some
circumstances.
>> William is right, but I cannot believe that a construction like
>>
>> [f(100, n) for n in [2,3,5]$List(Integer)]
>>
>> would work.
>
> The main reason why it is not working presently is because we have
> not constructed cartesian product over an arbitrary set of domains.
> But nothing in the language (even Spad) seems to prevent one from
> doing this.
Of course not, but note that you have a generator in the above
construction and thus the compiler does not know the length of the tuple
until it is *computed*. To make myself clear: I believe that one can
write a constuctor for arbitrary tuples of variable length, but Martin's
syntax to construct an element of such a type would not work. (Please
convince me otherwise by providing running code.)
>> [f(100, n), f(100, n), f(100, n)]
>
> You meant: [f(100,2), f(100,3), f(100,5)], I assume.
Of course.
>> should be easily definable and give an element in the cartesian
>> product of PF(2), PF(3), and PF(5). But that is a finite
>> construct and not done via Generator as above.
>
> As discussed above, what is missing is cartesian product over an
> arbitrary set of domains. If domains are first class objects, we
> should be able to construct sets of them, even via Generator, and
> hence also cartesian product.
Oh, yes, of course it is possible (even now) to construct a
heterogeneous tuple type via Generator. But Martin's construction would
mean to construct the type AND the element at the same time. And that (I
believe) is impossible.
> At the very least, one should be able
> to form a set or list of domains of the same category (which IS
> homogeneous).
No problem in Aldor.
#include "aldor"
U: List PrimitiveType := [Integer, String, Character];
That is a completely valid Aldor program.
>> PFCartesian(k: Integer): with {
>> coerce: ((n: Integer) -> PF(n)) -> %;
>> ...
>> }== add { ... }
> I am not following. Is PFCartesian(k) a cartesian product of the
> first k prime fields, like PFCartesian(3) is PF(2) x PF(3) x PF(5)?
> Then given a function (n:Integer)->PF(n) (basically, an sequence of
> elements, one from each PF(n), and n better be a prime! but let's
> pretend we interpret PF(n) as Integer mod n), the coerce function
> maps the anonymous function to PFCartesian(k) by using the first k
> elements in the sequence?
I was not thinking too much about it. I wanted that PFCartesian(7)
stands for PF(2) x PF(3) x PF(5) x PF(7) and PF for PrimeField. And the
coerce function basically turns the projection functions into an element
of PFCartesian.
As representation I could choose
Rep == (n: Integer) -> PF(n);
But I still cannot make
[f(100, n) for n in [2,3,5]$List(Integer)]
into valid Aldor code if f is the function given by Martin.
Can you?
Ralf
More information about the Aldor-l
mailing list