www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Pointer to environment.get

reply Vino <akashvino79 gmail.com> writes:
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);
}
```
Aug 27 2023
parent reply Basile B. <b2.temp gmx.com> writes:
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: ```d 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")
Aug 28 2023
parent reply Basile B. <b2.temp gmx.com> writes:
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: ```d 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 ```d 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.
Aug 28 2023
parent Vino <akashvino79 gmail.com> writes:
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 ```d 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
Aug 30 2023