Thread overview
Pointer to environment.get
Aug 28, 2023
Vino
Aug 28, 2023
Basile B.
Aug 28, 2023
Basile B.
Aug 30, 2023
Vino
August 28, 2023

Hi All,

The the below code is not working, hence requesting your help.

Code:

import std.stdio;
import std.process: environment;
void main () {
   int* ext(string) = &environment.get("PATHEXT");
   writeln(*ext);
}
August 28, 2023

On Monday, 28 August 2023 at 06:38:50 UTC, Vino wrote:

>

Hi All,

The the below code is not working, hence requesting your help.

Code:

import std.stdio;
import std.process: environment;
void main () {
   int* ext(string) = &environment.get("PATHEXT");
   writeln(*ext);
}

Problems is that "PATHEXT" is a runtime argument. If you really want to get a pointer to the function for that runtime argument you can use a lambda:

import std.stdio;
import std.process: environment;
void main () {

    alias atGet = {return environment.get("PATHEXT");}; // really lazy

    writeln(atGet);         // pointer to the lambda
    writeln((*atGet)());    // call the lambda
}

There might be other ways, but less idiomatic (using a struct + opCall, a.k.a a "functor")

August 28, 2023

On Monday, 28 August 2023 at 10:20:14 UTC, Basile B. wrote:

>

On Monday, 28 August 2023 at 06:38:50 UTC, Vino wrote:

>

Hi All,

The the below code is not working, hence requesting your help.

Code:

import std.stdio;
import std.process: environment;
void main () {
   int* ext(string) = &environment.get("PATHEXT");
   writeln(*ext);
}

Problems is that "PATHEXT" is a runtime argument. If you really want to get a pointer to the function for that runtime argument you can use a lambda:

import std.stdio;
import std.process: environment;
void main () {

    alias atGet = {return environment.get("PATHEXT");}; // really lazy

    writeln(atGet);         // pointer to the lambda
    writeln((*atGet)());    // call the lambda
}

There might be other ways, but less idiomatic (using a struct + opCall, a.k.a a "functor")

To go further, the correct code for syntax you wanted to use is actually

alias Ext_T = string (const char[] a, string b); // define a function type
alias Ext_PT = Ext_T*; // define a function **pointer** type
Ext_PT ext = &environment.get;

But as you can see that does not allow to capture the argument. Also it only work as AliasDeclaration RHS.

August 30, 2023

On Monday, 28 August 2023 at 10:27:07 UTC, Basile B. wrote:

>

On Monday, 28 August 2023 at 10:20:14 UTC, Basile B. wrote:

>

[...]

To go further, the correct code for syntax you wanted to use is actually

alias Ext_T = string (const char[] a, string b); // define a function type
alias Ext_PT = Ext_T*; // define a function **pointer** type
Ext_PT ext = &environment.get;

But as you can see that does not allow to capture the argument. Also it only work as AliasDeclaration RHS.

Thank you