CTFE and return statement from delegate
Rajesh
joseph.rajesh at gmail.com
Mon Jun 30 04:51:27 UTC 2025
On Monday, 30 June 2025 at 02:21:29 UTC, WraithGlade wrote:
> On Sunday, 29 June 2025 at 13:06:38 UTC, Rajesh wrote:
>> This is simplified code which I am using in my project.
>>
>> ...
>
> Welcome to the forum and good luck in your programming
> endeavors Rajesh.
>
> Honestly, it isn't clear what you are even trying to do in your
> code and thus it would probably be easier for members of the
> forum to help you if you gave more context and a more complete
> and preferably directly executable example (such as a sample
> that has a working `unittest` or `main` function).
>
> However:
>
> The compiler's mention of `__capture` likely refers to the
> internal state of the `delegate` object you are passing into
> `opApply`. Delegates are what are called closures (or at least
> have the ability to become closures), which means they can
> implicitly capture copies or references of local variables
> located near the point of the delegate's use.
>
> You may have omitted something from your sample code that you
> think/thought was irrelevant but is causing a variable to be
> captured by the `delegate`.
>
> If there's even a single runtime-dependent variable in the
> `Problem` object then it could cause the whole object to become
> not computable in compile time. Compile time computation in
> programming languages sometimes have arbitrary limitations,
> since compile-time evaluation essentially hinges on the
> existence of an interpreter running in compile time alongside
> the compiler and that interpreter may not have the same
> abilities as the compiler and vice versa.
>
> I haven't tried to run your code though, because there is
> little/no clarity on what your intent with it actually even is.
>
> Perhaps try rewriting the relevant code in a more clear-headed
> and intentional way, patiently building it up piece by piece
> with care instead of trying to rush through it. Ask yourself
> each step of the way if you actually know what each thing does
> and what your intent is. A more *purposeful* approach is likely
> to clarify your code, which may cause the errors to drop out of
> whatever the real code is.
>
> Aimless code has a tendency to be more erroneous than code that
> serves a real purpose because there is less anchoring your mind
> as to what you are doing and less tangible criteria to test
> against to discern when the code ever becomes "correct".
>
> Anyway, I hope that helps.
Thanks Wraith, for taking the time to reply. I am new to D and
trying to understand how delegates, CTFE, and other features
work. When I faced the issue in one of my project, I created a
simpler example to see if we can really use return statement
inside a delegate in a compile time ctor.
I have already modified my project to avoid this logic, and that
version works fine. However, I am trying to understand why this
failure is happening. Is it a limitation of the language, a
compiler bug, or something else?
Following is the complete code. I even tested this with [online
compiler](https://run.dlang.io/). I tried both dmd and ldc2.
Locally I am working with ldc2 compiler. In all the cases I am
getting the same error, i.e.
```
Error: variable `__capture` cannot be read at compile time
onlineapp.d(27): called from here: `Problem(0).this(1)`
auto compile_time_var = Problem(1);
```
This is full code:
```
import std;
struct NumberType
{
int num;
int opApply(int delegate(int) dg)
{
int result = dg(num);
return result;
}
}
struct Problem {
int value;
this(int val) {
auto myType = NumberType(18);
foreach (int number; myType)
{
return;
}
}
}
auto compile_time_var = Problem(1);
void TestFunction() {
auto runtime_var = Problem(1);
}
void main()
{
TestFunction();
}
```
More information about the Digitalmars-d-learn
mailing list