Templates in classes => what is wrong?

Xan xancorreu at gmail.com
Tue Apr 17 11:00:53 PDT 2012


On Tuesday, 17 April 2012 at 15:59:25 UTC, Ali Çehreli wrote:
> On 04/17/2012 08:42 AM, Xan wrote:
>
> > How to get the "code" of a function or delegate
> >
> > |___string toString() {
> > |___|___return format("%s (versió %s): Domini -> Recorregut,
> %s(x) =
> > %s", nom, versio, nom, &funcio);
> >
> > |___}
> >
> > does not produce the desired result and &funcio without
> ampersand
> > produces me an error.
> >
> > So, my doubts are:
> > given a function:
> >
> > - how can I get the domain
> > - how can I get the range
>
> I did not understand those. :(

Domain is the set of values that we pass to the function and 
Range is the set of Values which are returned by function.

V delegate (U) f;
f has Domain U and Range V

I want to "print" the type of "U" and "V".

Something like:

class Algorisme(U,V) {
	string nom;
	uint versio;
	alias V delegate (U) Funcio;
	Funcio funcio;


	this(string nom, uint versio, Funcio funcio) {
		this.nom = nom;
		this.versio = versio;
		this.funcio = funcio;
	}

	string toString() {
		return format("%s (versió %s): %s -> %s, %s(x) = %s", nom, 
versio, V, U, nom, &funcio);

	}
}


but I receive

algorisme.d:24: Error: type int has no value
algorisme.d:24: Error: type int has no value

when I call with Algorisme!(int, int) intead of receiving "int" 
and "int" as Domain and Range

>
> > - how can I get the code of the function?
> >
> > See https://gist.github.com/2394274
> >
>
> I don't think D has any help there. You can keep the function 
> as a string yourself and convert to actual code at compile time 
> with a string mixin. For that to happen, the function text may 
> be an additional template parameter:
>
> import std.conv, std.stdio, std.stream, std.string;
> import std.socket, std.socketstream;
> import std.datetime;
>
> class Algorisme(U,V,string funcioText) {
> 	string nom;
> 	uint versio;
> 	alias V delegate (U) Funcio;
> 	Funcio funcio;
>
>
> 	this(string nom, uint versio) {
> 		this.nom = nom;
> 		this.versio = versio;
> 		this.funcio = mixin(funcioText);
> 	}
>
> 	string toString() {
>             return format("%s (versió %s): Domini -> 
> Recorregut, %s(x) = %s",
>                           nom, versio, nom, funcioText);
> 	}
> }
>
>
> alias Algorisme!(int, int, "(int a) { return 2 * a; }") 
> AlgorismeEnters;
>
> void main(string [] args)
> {
>
> 	auto alg = new AlgorismeEnters("Doblar", 1);
> 	writeln(alg);
>
> }
>
> Ali

It's ugly code. I think I could call some procedure like f.code 
(f is a function) to obtain the "code" how f is defined. But 
stricly in mathematical thinking it's not adequate, because more 
codes could result in the same (mathematical function): x + x is 
the double of x; and 2*x is too.

Perhaps if I change Algorisme and add the string field "code" and 
if there is any procedure to copy the 3rd argument in the 
constructor and pass as string in the 4th argument (in the 
constructor)

class Algorisme(U,V) {
|___string nom;
|___uint versio;
|___alias V delegate (U) Funcio;
|___Funcio funcio;
|___string code;


|___this(string nom, uint versio, Funcio funcio) {
|___|___this.nom = nom;
|___|___this.versio = versio;
|___|___this.funcio = funcio;
         this.code = funcio.WHAT PROCEDURE?;
|___}


Regards,
Xan.





More information about the Digitalmars-d-learn mailing list