[Aldor-l] [Axiom-math] Are Fraction and Complex domains.

Christian Aistleitner tmgisi at gmx.at
Tue May 16 08:46:31 EDT 2006


Hello,

On Tue, 16 May 2006 00:35:36 +0200, Ralf Hemmecke  
<hemmecke at risc.uni-linz.ac.at> wrote:

>> | System(): with {
>> |    timestamp: Integer;
>> |    cpuTemperature: Integer;
>> | } == add {
>> |    timestamp: Integer == { obtain the timestamp somehow }
>> |    cpuTemperature: Integer == { obtain the timestamp somehow }
>> | }
[...]
>> | | System: with {
>> |    grabData: () -> %
>> |    timestamp: % -> Integer;
>> |    cpuTemperature: % -> Integer;
>> | } == add {
>> |    macro Rep == Record( ts: Integer, temp: Integer );
>> | |    grabData(): % == {
>> |       per record( obtain the timestamp somehow, obtain the  
>> temperature  | somehow );
>> |    }
>> | |    timestamp( a: % ): Integer == { (rep a) . ts; };
>> |    cpuTemperature( a: % ): Integer == { (rep a) . temp; };
>> | }
>
> I would also claim the second is better. Christian, if you call the  
> first System() only once then you wouldn't make it a function, but you  
> certainly like to call System() several times.

Yes, certainly. Consider the following piece of code:

printSystemStats(): () == {
	import from System(), ...;
	stdout << cpuTemperature << "  " << timestamp << newline;
}

monitor(): () == {
	repeat {
		printSystemStats();
		some code to sleep 10 seconds
	}
}

There, System() would get called again and again. Every ten seconds a new  
instance.

>> | To determine the given temperature and timestamp for the system  
>> involves 1  | Function call for non functional Domains and 3 for  
>> functional Domains.
>
> I guess you are wrong.
>
> In the first case, each time you want a time-temperature pair you must  
> do like...
>
> S == System();
> t := timeStamp$S;
> T := cpuTemperature$S;
>
> in the second case it is
>
> d := grabData()$System;
> t := timeStamp(d)$System;
> T := cpuTemperature(d)$System;
>
> So what do you gain?

Again: The first piece of code has one function call ... namely System().  
Then obtaining timeStamp and cpuTemperature is getting constants and not  
calling functions.
1 function call.

In the second case, grabData() is "calling a function". Same holds for  
timeStamp(d) and cpuTemperature.
3 function calls.

In a general setting, calling functions is slow, so we do not want to do  
it often.

Again. I am not saying, this is the way to go ... It is just an example,  
where non functionality might be usefull.

>> If I do not have a functional type system, how am I supposed to do  
>> "separate compilation"?  How am I supposed to do calls?
>
> [ Ralf clairifying how it can be done ]

Also have in mind, that "with" statements are a anonymous. You can check  
whether

Dom: with {
  f:() -> ();
  g:() -> ();
}

has the f function by

Dom has with { f:() -> (); }

Note that these are two completely different with statements!

> But it has to be discussed what "equality of arguments" actually means  
> in order to be able to speak about the functionality property, since not  
> every type exports "=: (%, %) -> %".

This is the main point to the whole discussion and the main drawback of  
functionality. "How to check equality"?
Even and if everything exports "=", we do not know about the semantics of  
"=". We would have to bind them :(.
The interesting part is that with in a purely functional setting we will  
also run into troubles soon, when using pointer comparison:

DomA( a: List Integer ):with {...} == add {...}

a: List Integer := [ 1, 2, 3 ];
R == DomA( a );
a . 2 := 300;
S == DomA( a );

a still refers to the same memory location, but it is different. Would R  
equal S?

--
Kind regards,
Christian




More information about the Aldor-l mailing list