Re: CTFE write message to console

2024-04-05 Thread Salih Dincer via Digitalmars-d-learn

On Friday, 5 April 2024 at 14:41:12 UTC, Carl Sturtivant wrote:

On Friday, 5 April 2024 at 07:37:20 UTC, Paolo Invernizzi wrote:

pragma(msg, x) ?


No.

`__ctfeWrite(x)` is executed inside an executing function like 
any other statement in it, and can have an argument `x` 
computed during that execution.


It is defined to output the computed text `x` to stderr when 
the function it is a part of is called as CTFE by the compiler 
and to be a no-op if that function is called at run time in the 
compiled executable.


So it is a replacement for `std.stdio.write` in a CTFE 
function, handy among other things for reporting what's going 
on during the execution of that function by the compiler.


`pragma(msg, x)` works during its *compilation*, so putting it 
as a line in a CTFE-called function would not execute it when 
the function is called by the compiler. That being the case, 
`x` may not be a value computed when that function executes. 
Such a value is "not available at compile time", only at CTFE 
run time. The CTFE function is not running when it is being 
compiled.


It is possible that `x` in `pragma(msg, x)` be computed with a 
call to a function as its return value, i.e. computed by CTFE, 
but that call will be made when `pragma(msg, x)` is compiled, 
and is a part of compiling it. Only when the function has 
returned producing `x` does the `pragma(msg, x)` do its work.


This works:
```d

alias E = double;
auto r = 0.iota!E(1,.05)

static this()
{
 alias ranges = imported!"std.meta".AliasSeq!(isRandomAccessRange,
 isForwardRange, isInputRange, isOutputRange, 
isBidirectionalRange);

 static foreach(R; ranges) pragma(msg, R!(typeof(r), E));
}

void main() {}
```
SDB@79


Re: CTFE write message to console

2024-04-05 Thread Carl Sturtivant via Digitalmars-d-learn

On Friday, 5 April 2024 at 07:37:20 UTC, Paolo Invernizzi wrote:

pragma(msg, x) ?


No.

`__ctfeWrite(x)` is executed inside an executing function like 
any other statement in it, and can have an argument `x` computed 
during that execution.


It is defined to output the computed text `x` to stderr when the 
function it is a part of is called as CTFE by the compiler and to 
be a no-op if that function is called at run time in the compiled 
executable.


So it is a replacement for `std.stdio.write` in a CTFE function, 
handy among other things for reporting what's going on during the 
execution of that function by the compiler.


`pragma(msg, x)` works during its *compilation*, so putting it as 
a line in a CTFE-called function would not execute it when the 
function is called by the compiler. That being the case, `x` may 
not be a value computed when that function executes. Such a value 
is "not available at compile time", only at CTFE run time. The 
CTFE function is not running when it is being compiled.


It is possible that `x` in `pragma(msg, x)` be computed with a 
call to a function as its return value, i.e. computed by CTFE, 
but that call will be made when `pragma(msg, x)` is compiled, and 
is a part of compiling it. Only when the function has returned 
producing `x` does the `pragma(msg, x)` do its work.


Re: CTFE write message to console

2024-04-05 Thread Paolo Invernizzi via Digitalmars-d-learn

On Thursday, 4 April 2024 at 15:43:55 UTC, Carl Sturtivant wrote:
On Thursday, 4 April 2024 at 15:07:21 UTC, Richard (Rikki) 
Andrew Cattermole wrote:


Ah yes, I forgot about that particular thing, doesn't see much 
use as far as I'm aware.


It should be working though.


```D
enum X = computeX("A message");

string computeX(string msg) {
auto s = "CTFE msg: ";
auto x = imported!"std.format".format("%s%s\n", s, msg);
__ctfeWrite(x);
return x;
}

void main() {
import std.stdio;
writeln(X);
}
```
Produces no output on compilation, and writes out `CTFE msg: A 
message` when run.


pragma(msg, x) ?


Re: CTFE write message to console

2024-04-04 Thread Salih Dincer via Digitalmars-d-learn
On Thursday, 4 April 2024 at 15:47:53 UTC, Richard (Rikki) Andrew 
Cattermole wrote:

Oh hey!

https://github.com/dlang/dmd/pull/16250

It was implemented literally 2 weeks ago!

Nightly should have it 
https://github.com/dlang/dmd/releases/tag/nightly


Good news, thanks...

SDB@79



Re: CTFE write message to console

2024-04-04 Thread Carl Sturtivant via Digitalmars-d-learn
On Thursday, 4 April 2024 at 15:47:53 UTC, Richard (Rikki) Andrew 
Cattermole wrote:

Oh hey!

https://github.com/dlang/dmd/pull/16250

It was implemented literally 2 weeks ago!

Nightly should have it 
https://github.com/dlang/dmd/releases/tag/nightly


Wow! Happy that's in. It was a bit mysterious, but now that 
request says it was never implemented. Until now. Just what I 
want!


Re: CTFE write message to console

2024-04-04 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn

Oh hey!

https://github.com/dlang/dmd/pull/16250

It was implemented literally 2 weeks ago!

Nightly should have it https://github.com/dlang/dmd/releases/tag/nightly


Re: CTFE write message to console

2024-04-04 Thread Carl Sturtivant via Digitalmars-d-learn
On Thursday, 4 April 2024 at 15:07:21 UTC, Richard (Rikki) Andrew 
Cattermole wrote:


Ah yes, I forgot about that particular thing, doesn't see much 
use as far as I'm aware.


It should be working though.


```D
enum X = computeX("A message");

string computeX(string msg) {
auto s = "CTFE msg: ";
auto x = imported!"std.format".format("%s%s\n", s, msg);
__ctfeWrite(x);
return x;
}

void main() {
import std.stdio;
writeln(X);
}
```
Produces no output on compilation, and writes out `CTFE msg: A 
message` when run.




Re: CTFE write message to console

2024-04-04 Thread Carl Sturtivant via Digitalmars-d-learn
On Thursday, 4 April 2024 at 14:06:19 UTC, Richard (Rikki) Andrew 
Cattermole wrote:


```d
static assert(0, "message");
```

Or if it is known to be CTFE'd

```d
assert(0, "message");
```

Just a warning, its a one time use only for both.

No other way to do it.


That's ... unfortunate.

Some search of the forum led me to some [decade plus old 
discussion](https://forum.dlang.org/post/j1n1m2$24p0$1...@digitalmars.com) of a possible CTFE writeln function that would be a no-op at runtime, which to my surprise led me to find [core_builtins.__ctfeWrite](https://dlang.org/phobos/core_builtins.html#.__ctfeWrite) but when I tried it out, it compiled yet output no text to the console. Given your remarks I suppose I should have expected this.


Re: CTFE write message to console

2024-04-04 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn



On 05/04/2024 4:04 AM, Carl Sturtivant wrote:
On Thursday, 4 April 2024 at 14:06:19 UTC, Richard (Rikki) Andrew 
Cattermole wrote:


```d
static assert(0, "message");
```

Or if it is known to be CTFE'd

```d
assert(0, "message");
```

Just a warning, its a one time use only for both.

No other way to do it.


That's ... unfortunate.

Some search of the forum led me to some [decade plus old 
discussion](https://forum.dlang.org/post/j1n1m2$24p0$1...@digitalmars.com) 
of a possible CTFE writeln function that would be a no-op at runtime, 
which to my surprise led me to find 
[core_builtins.__ctfeWrite](https://dlang.org/phobos/core_builtins.html#.__ctfeWrite) but when I tried it out, it compiled yet output no text to the console. Given your remarks I suppose I should have expected this.


Ah yes, I forgot about that particular thing, doesn't see much use as 
far as I'm aware.


It should be working though.


Re: CTFE write message to console

2024-04-04 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn

On 05/04/2024 2:54 AM, Carl Sturtivant wrote:
I'm writing CTFE on Windows, latest DMD compiler. How should I write a 
message to the console (stderr) from a CTFE function call during 
compilation?


```d
static assert(0, "message");
```

Or if it is known to be CTFE'd

```d
assert(0, "message");
```

Just a warning, its a one time use only for both.

No other way to do it.