Thread overview
std.format with named args
Oct 17, 2023
Vitaliy Fadeev
Oct 17, 2023
Imperatorn
Oct 17, 2023
Vitaliy Fadeev
Oct 17, 2023
Vitaliy Fadeev
Oct 17, 2023
Imperatorn
October 17, 2023

Hi all!
I want readable mixin.
I want pass variable to string.
I want string with named args.
Like this:

    enum JMP_ADDR_R = "RAX";

    mixin( format!"asm {
        jmp [JMP_ADDR_R];
   }"( JMP_ADDR_R ));    // IT NOT WORK

Not this:

    enum JMP_ADDR_R = "RAX";

    mixin( format!"asm {
        jmp [%s];
   }"( JMP_ADDR_R ));    // WORK, BUT NOT-READABLE

In large code named identifiers more readable.

In future it will used in jump table, like this:

    mixin( format!"asm {
        lea JMP_ADDR_R, qword ptr [ JMP_I_R * PTR_SIZE + TBL_ADDR ];
        jmp [JMP_ADDR_R];
    }"( JMP_I_R, PTR_SIZE, TBL_ADDR, JMP_ADDR_R ));

Please, help me find a solution...
or exists std.format with named args ?
or another solution with named args ?

October 17, 2023

On Tuesday, 17 October 2023 at 06:46:31 UTC, Vitaliy Fadeev wrote:

>

Hi all!
I want readable mixin.
I want pass variable to string.
I want string with named args.
Like this:

    enum JMP_ADDR_R = "RAX";

    mixin( format!"asm {
        jmp [JMP_ADDR_R];
   }"( JMP_ADDR_R ));    // IT NOT WORK

Not this:

    enum JMP_ADDR_R = "RAX";

    mixin( format!"asm {
        jmp [%s];
   }"( JMP_ADDR_R ));    // WORK, BUT NOT-READABLE

In large code named identifiers more readable.

In future it will used in jump table, like this:

    mixin( format!"asm {
        lea JMP_ADDR_R, qword ptr [ JMP_I_R * PTR_SIZE + TBL_ADDR ];
        jmp [JMP_ADDR_R];
    }"( JMP_I_R, PTR_SIZE, TBL_ADDR, JMP_ADDR_R ));

Please, help me find a solution...
or exists std.format with named args ?
or another solution with named args ?

Without string interpolation the best you can do is https://dlang.org/library/std/conv/text.html

Or write some code yourself, unfortunately

October 17, 2023

On Tuesday, 17 October 2023 at 06:57:07 UTC, Imperatorn wrote:

>

On Tuesday, 17 October 2023 at 06:46:31 UTC, Vitaliy Fadeev wrote:

>

Hi all!
I want readable mixin.
I want pass variable to string.
I want string with named args.
Like this:

    enum JMP_ADDR_R = "RAX";

    mixin( format!"asm {
        jmp [JMP_ADDR_R];
   }"( JMP_ADDR_R ));    // IT NOT WORK

Not this:

    enum JMP_ADDR_R = "RAX";

    mixin( format!"asm {
        jmp [%s];
   }"( JMP_ADDR_R ));    // WORK, BUT NOT-READABLE

In large code named identifiers more readable.

In future it will used in jump table, like this:

    mixin( format!"asm {
        lea JMP_ADDR_R, qword ptr [ JMP_I_R * PTR_SIZE + TBL_ADDR ];
        jmp [JMP_ADDR_R];
    }"( JMP_I_R, PTR_SIZE, TBL_ADDR, JMP_ADDR_R ));

Please, help me find a solution...
or exists std.format with named args ?
or another solution with named args ?

Without string interpolation the best you can do is https://dlang.org/library/std/conv/text.html

Or write some code yourself, unfortunately

May be.

"String interpolation"

    mixin( format!"asm {
        lea JMP_ADDR_R, qword ptr [ JMP_I_R * PTR_SIZE + TBL_ADDR ];
        jmp [JMP_ADDR_R];
    }"( JMP_I_R, PTR_SIZE, TBL_ADDR, JMP_ADDR_R ));

vs

text()

    mixin( text( "asm {
        lea", JMP_ADDR_R, ", qword ptr [ ", JMP_I_R, " * ", PTR_SIZE, " + ", TBL_ADDR, " ];
        jmp [", JMP_ADDR_R, "];
    }"));

"String interpolation" more readable.
"String interpolation" easier to type.
"text()" syntax is highlighted,
Thanks for the correct keywords: "String interpolation" - this is what I'm looking for.

Is there a "string interpolation" solution?

October 17, 2023

On Tuesday, 17 October 2023 at 07:22:41 UTC, Vitaliy Fadeev wrote:

>

On Tuesday, 17 October 2023 at 06:57:07 UTC, Imperatorn wrote:

>

On Tuesday, 17 October 2023 at 06:46:31 UTC, Vitaliy Fadeev wrote:

>

Hi all!
I want readable mixin.
I want pass variable to string.
I want string with named args.
Like this:

    enum JMP_ADDR_R = "RAX";

    mixin( format!"asm {
        jmp [JMP_ADDR_R];
   }"( JMP_ADDR_R ));    // IT NOT WORK

Not this:

    enum JMP_ADDR_R = "RAX";

    mixin( format!"asm {
        jmp [%s];
   }"( JMP_ADDR_R ));    // WORK, BUT NOT-READABLE

In large code named identifiers more readable.

In future it will used in jump table, like this:

    mixin( format!"asm {
        lea JMP_ADDR_R, qword ptr [ JMP_I_R * PTR_SIZE + TBL_ADDR ];
        jmp [JMP_ADDR_R];
    }"( JMP_I_R, PTR_SIZE, TBL_ADDR, JMP_ADDR_R ));

Please, help me find a solution...
or exists std.format with named args ?
or another solution with named args ?

Without string interpolation the best you can do is https://dlang.org/library/std/conv/text.html

Or write some code yourself, unfortunately

May be.

"String interpolation"

    mixin( format!"asm {
        lea JMP_ADDR_R, qword ptr [ JMP_I_R * PTR_SIZE + TBL_ADDR ];
        jmp [JMP_ADDR_R];
    }"( JMP_I_R, PTR_SIZE, TBL_ADDR, JMP_ADDR_R ));

vs

text()

    mixin( text( "asm {
        lea", JMP_ADDR_R, ", qword ptr [ ", JMP_I_R, " * ", PTR_SIZE, " + ", TBL_ADDR, " ];
        jmp [", JMP_ADDR_R, "];
    }"));

"String interpolation" more readable.
"String interpolation" easier to type.
"text()" syntax is highlighted,
Thanks for the correct keywords: "String interpolation" - this is what I'm looking for.

Is there a "string interpolation" solution?

scriptlike looks perfecto!

```D
        enum JMP_ADDR_R = ...
        ...

        import scriptlike;
        writeln( mixin(interp!"
            asm {
                lea ${JMP_ADDR_R}, qword ptr [ ${JMP_I_R} * ${PTR_SIZE} + ${TBL_ADDR} ];
                jmp [${JMP_ADDR_R}];
            }
        ") );
```

produced:

```
            asm {
                lea RAX, qword ptr [ RDX * 8 + 5594AA134290 ];
                jmp [RAX];
            }
```

Closed!
scriptlike
Thanks, all!

October 17, 2023

On Tuesday, 17 October 2023 at 07:53:28 UTC, Vitaliy Fadeev wrote:

>

On Tuesday, 17 October 2023 at 07:22:41 UTC, Vitaliy Fadeev wrote:

>

[...]

scriptlike looks perfecto!

```D
        enum JMP_ADDR_R = ...
        ...

        import scriptlike;
        writeln( mixin(interp!"
            asm {
                lea ${JMP_ADDR_R}, qword ptr [ ${JMP_I_R} * ${PTR_SIZE} + ${TBL_ADDR} ];
                jmp [${JMP_ADDR_R}];
            }
        ") );
```

produced:

```
            asm {
                lea RAX, qword ptr [ RDX * 8 + 5594AA134290 ];
                jmp [RAX];
            }
```

Closed!
scriptlike
Thanks, all!

Nice