Thread overview
D: How to check if a function is chained? a().b().c();
Nov 18
BoQsc
November 18

Let's say we have a chain of functions.

 a().b().c();

I would like to have a behaviour in a() that would check if there is b() or c() chained to it.

If a();is not chained: do a writeln("You forgot to chain this function!");

A function that executes a program

For me syntactically it is important. One real world application would be:

program("someProgramName").pipe("someOtherProgramName");
Executes and pipes output to another program.

program(); - Only executes the program.

November 18

On Saturday, 18 November 2023 at 07:47:19 UTC, BoQsc wrote:

>

Let's say we have a chain of functions.

 a().b().c();

I would like to have a behaviour in a() that would check if there is b() or c() chained to it.

If a();is not chained: do a writeln("You forgot to chain this function!");

A function that executes a program

For me syntactically it is important. One real world application would be:

program("someProgramName").pipe("someOtherProgramName");
Executes and pipes output to another program.

program(); - Only executes the program.

It would be easy if you have some kind of aspect oriented framework. Other than that I guess you need to check the trace info (or possibly trait).

November 18

On Saturday, 18 November 2023 at 07:47:19 UTC, BoQsc wrote:

>

Let's say we have a chain of functions.

 a().b().c();

I would like to have a behaviour in a() that would check if there is b() or c() chained to it.

If a();is not chained: do a writeln("You forgot to chain this function!");

A function that executes a program

For me syntactically it is important. One real world application would be:

program("someProgramName").pipe("someOtherProgramName");
Executes and pipes output to another program.

program(); - Only executes the program.

Consider adding @mustuse on the return type.

https://dlang.org/spec/attribute.html#mustuse-attribute

-Steve

November 18

On Saturday, 18 November 2023 at 07:47:19 UTC, BoQsc wrote:

>

program("someProgramName").pipe("someOtherProgramName");
Executes and pipes output to another program.

program(); - Only executes the program.

Serious answer: have a function handle this, instead of the semicolon.

program("p1").pipe("p2").run; - does that
program("p1").run; - does the other

Supposedly this is the "builder pattern" but the wikipedia entry seems to be deliberately bad.

Unserious answer, especially unsuitable for your concrete example where you probably want subprocesses to run reliably and in order: do something with object lifetime functions.

import std.stdio : writeln;

class Program {
    string program;
    bool used;
    this(string p) { program = p; }
    ~this() { if (!used) writeln("You forgot to chain program: ", program); }
}

Program a(string p) {
        return new Program(p);
}

void b(Program p) {
        p.used = true;
        writeln("using program: ", p.program);
}

void main() {
        a("2");
        a("1").b();
}