On Tuesday, 17 April 2012 at 18:00:55 UTC, Xan wrote:
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.


The idea is behind this https://gist.github.com/2407923
But I receive:

$ gdmd-4.6 algorisme_code.d
algorisme_code.d:22: Error: variable codi cannot be read at compile time algorisme_code.d:22: Error: argument to mixin must be a string, not (codi)

What can I do?

Thanks,
Xan.

Reply via email to