[Aldor-l] question about set! in streams
Martin Rubey
martin.rubey at univie.ac.at
Thu Aug 24 13:31:26 EDT 2006
Dear all,
I'm just attempting to solve the initial values problem. However I stepped on
an Aldor problem.
Can somebody explain the output of the attached program to me?
WARNING: it enters an infinite loop.
The output begins with
-------------------------------------------------------------------------------
set!01
set!end
Hi
set!01
coeff0
coeff0
coeff0
coeff0
coeff0
-------------------------------------------------------------------------------
and goes on with coeff0 forever...
Short explanation: The following program works as expected. Its output is
simply
-------------------------------------------------------------------------------
set!01
-------------------------------------------------------------------------------
i.e., coefficient is never called.
#include "aldor"
#include "aldorio"
define GeneratingSeriesCategory: Category == with {
0: %;
coefficient: (%, Integer) -> Integer;
set!: (%, Integer, Integer) -> Integer;
}
GeneratingSeries: GeneratingSeriesCategory == add {
Rep == Stream Integer;
import from Integer, Rep, MachineInteger;
0: % == per stream(0);
coefficient(x: %, n: Integer): Integer == {
stdout << "coeff" << n << newline;
(rep x).(machine n);
}
set!(x: %, n: Integer, v: Integer): Integer == {
stdout << "set!" << n << v << newline;
set!(rep x, machine n, v);
}
}
test(): () == {
import from Integer;
g: GeneratingSeries;
set!(g, 0, 1);
}
test();
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
The story is different for the following program, where some recursion is
taking place. Note that generatingSeries$MyList is defined in terms of
itself. Still, I don't understand why coefficient is called. Is there a way to
modify generatingSeries$MyList without having coefficient called?
!!!PLEASE HELP!!!
Martin
-------------------------------------------------------------------------------
#include "aldor"
#include "aldorio"
define GeneratingSeriesCategory: Category == with {
0: %;
coerce: Stream Integer -> %;
coefficient: (%, Integer) -> Integer;
set!: (%, Integer, Integer) -> Integer;
+: (%, %) -> %;
*: (%, %) -> %;
}
GeneratingSeries: GeneratingSeriesCategory == add {
Rep == Stream Integer;
import from Integer, Rep, MachineInteger;
0: % == per stream(0);
coerce(s: Stream Integer): % == per s;
coefficient(x: %, n: Integer): Integer == {
stdout << "coeff" << n << newline;
(rep x).(machine n);
}
set!(x: %, n: Integer, v: Integer): Integer == {
stdout << "set!" << n << v << newline;
z := set!(rep x, machine n, v);
stdout << "set!end" << newline;
z;
}
(x: %) + (y: %): % == per stream(0$I, (n:MachineInteger):Integer
+-> (rep x).n + (rep y).n);
(x: %) * (y: %): % == {
local coeffTimes(nMI: MachineInteger): Integer == {
local n : Integer := nMI::Integer;
local startIdx: Integer := 0;
local endIdx : Integer := n;
-- if zero? ( coefficient( x, 0 ) ) then
-- {
-- startIdx := 1;
-- }
z: Integer := 0;
for k in startIdx .. endIdx repeat {
z := z + coefficient( x, k )
* coefficient( y, (n-k) );
}
z;
}
per stream(0$MachineInteger, coeffTimes);
}
}
define CombinatorialSpecies(L: PrimitiveType): Category == with {
generatingSeries: GeneratingSeries;
}
CharacteristicSpecies(n:Integer)(L:PrimitiveType): CombinatorialSpecies L ==
add {
Rep == Set L;
nn: MachineInteger == machine n;
nth(k: MachineInteger): Integer == if k = nn then return 1 else 0;
import from Rep;
generatingSeries: GeneratingSeries == {
import from Stream Integer;
stream(0, nth, next nn, 0) :: GeneratingSeries;
}
}
1(L: PrimitiveType): CombinatorialSpecies L ==
CharacteristicSpecies(0$Integer)(L);
X(L: PrimitiveType): CombinatorialSpecies L ==
CharacteristicSpecies(1$Integer)(L);
(+)(
F: (T: PrimitiveType) -> CombinatorialSpecies(T),
G: (T: PrimitiveType) -> CombinatorialSpecies(T)
): (L: PrimitiveType) -> CombinatorialSpecies(L) == (L: PrimitiveType):
CombinatorialSpecies(L) +-> add {
generatingSeries: GeneratingSeries == generatingSeries$F(L) +
generatingSeries$G(L);
}
(*)(
F: (T: PrimitiveType) -> CombinatorialSpecies(T),
G: (T: PrimitiveType) -> CombinatorialSpecies(T)
): (L: PrimitiveType) -> CombinatorialSpecies(L) == (L: PrimitiveType):
CombinatorialSpecies(L) +-> add {
generatingSeries: GeneratingSeries == {
import from Stream Integer;
coerce stream( 0$MachineInteger,
(n:MachineInteger):Integer +->
coefficient(generatingSeries$F(L) *
generatingSeries$G(L), n::Integer) );
}
}
MyList(L: PrimitiveType): CombinatorialSpecies L == ( 1 + X*MyList*MyList)(L);
testMyList(): () == {
import from Integer, String, MyList String;
h: GeneratingSeries := 0;
set!(h, 0, 1);
g: GeneratingSeries := generatingSeries;
stdout << "Hi" << newline; -- until here everything works just fine
set!(g, 0, 1);
}
testMyList();
-------------------------------------------------------------------------------
More information about the Aldor-l
mailing list