[Aldor-l] [Axiom-developer] Unions in Spad
Ralf Hemmecke
ralf at hemmecke.de
Mon Jul 9 14:08:48 EDT 2007
>> It looks as if one also could do
>>
>> if u case MachineInteger then ...
>>
>> with the current Aldor compiler, I just don't know how to type
>> "MachineInteger" since the compiler immediately takes the *type*
>> MachineInteger and not the *tag* MachineInteger.
> Use quotes like this?
>
> 'MachineInteger'
>
> That makes in a member of an Enumeration. Maybe that is what Aldor expects?
I should have told that I, of course, had already considered that option.
woodpecker:~/scratch>aldor -laldor -fx aaa.as
"aaa.as", line 13: if u case 'MachineInteger' then {
..................^
[L13 C19] #1 (Error) Argument 2 of `case' did not match any possible
parameter type.
The rejected type is Join(
with
== add ()
....
Expected one of:
-- Enumeration(machInt: Type)
-- Enumeration(sStr: Type)
But, of course it must fail.
'MachineInteger'
is nothing else than
Enumeration(MachineInteger: Type)
but what I need is an element of this enumeration type.
>> Anyway, that usage of MachineInteger is not specified in the AUG so
>> maybe one better does not use it that way.
> I have become quite confident that Aldor takes the most general road
> whenever possible inspite of what might or might not be written in the
> user's guide, so I am inclined to think that you are right.
> 'Union(Integer,String)' might very well be acceptible to the Aldor
> compiler, we just need to intuit the proper usage.
It seems that MachineInteger is rather special. Look at the following
session.
Ralf
woodpecker:~/scratch>aldor -gloop
AA L DDDD OOO RRRR
A A L D D O O R R
A A L D D O O R R
AAAAA L D D O O RRRR
A A L D D O O R R
A A LLLLL DDDD OOO R R
(c) Numerical Algorithms Group Ltd 1995-2001
Release: Aldor(C) version 1.0.3 for LINUX(glibc2.3) (debug version)
Type "#int help" for more details.
%1 >> #include "aldor"
Comp: 190 msec, Interp: 50 msec
%2 >> #include "aldorinterp"
Comp: 80 msec, Interp: 0 msec
%3 >> MyDom: with == add;
Defined MyDom @
with
== add ()
Comp: 10 msec, Interp: 0 msec
%4 >> MyDom
() @
with
== add ()
Comp: 0 msec, Interp: 0 msec
%5 >> import from 'MyDom'
Comp: 0 msec, Interp: 0 msec
%6 >> MyDom
^
[L6 C1] #1 (Error) Have determined 2 possible types for the expression.
Meaning 1:
with
== add ()
...
Meaning 2: Enumeration(MyDom: Type)
%7 >> MachineInteger
() @ Join(
PrimitiveType with
0: %
1: %
-: (%, %) -> %
bytes: %
coerce: SInt -> %
coerce: % -> SInt
integer: Literal -> %
min: %
max: %
odd?: % -> Boolean
zero?: % -> Boolean
== add ()
,
Join(CopyableType, IntegerType) with
mod+: (%, %, %) -> %
mod-: (%, %, %) -> %
mod*: (%, %, %) -> %
mod/: (%, %, %) -> %
mod^: (%, %, %) -> %
modInverse: (%, %) -> %
export to IntegerSegment(%)
== add ()
,
with
== add ()
)
Comp: 0 msec, Interp: 0 msec
%8 >> import from 'MachineInteger'
Comp: 10 msec, Interp: 0 msec
%9 >> MachineInteger
() @ Join(
PrimitiveType with
0: %
1: %
-: (%, %) -> %
bytes: %
coerce: SInt -> %
coerce: % -> SInt
integer: Literal -> %
min: %
max: %
odd?: % -> Boolean
zero?: % -> Boolean
== add ()
,
Join(CopyableType, IntegerType) with
mod+: (%, %, %) -> %
mod-: (%, %, %) -> %
mod*: (%, %, %) -> %
mod/: (%, %, %) -> %
mod^: (%, %, %) -> %
modInverse: (%, %) -> %
export to IntegerSegment(%)
== add ()
,
with
== add ()
)
Comp: 0 msec, Interp: 0 msec
But try to compile
---BEGIN aaa.as
#include "aldor"
#include "aldorio"
macro I == MachineInteger;
M1: with == add;
main(): () == {
U == Union(M1, String);
import from String;
import from U;
import from 'M1';
s: String := "I am a string";
u: U := union s;
if u case M1 then {
stdout << "Integer: " << newline;
} else {
stdout << "String: " << newline;
}
}
main();
---END aaa.as
woodpecker:~/scratch>aldor -laldor -fx aaa.as
Compiler bug...Bug: gen0UnionCaseIndex: branch not in union
Cool!
More information about the Aldor-l
mailing list