std.format with named args
Vitaliy Fadeev
vital.fadeev at gmail.com
Tue Oct 17 07:53:28 UTC 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:
>>>
>>> ```D
>>> enum JMP_ADDR_R = "RAX";
>>>
>>> mixin( format!"asm {
>>> jmp [JMP_ADDR_R];
>>> }"( JMP_ADDR_R )); // IT NOT WORK
>>> ```
>>>
>>> Not this:
>>>
>>> ```D
>>> 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:
>>>
>>> ```D
>>> 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"
> ```D
> 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()
> ```D
> 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!
More information about the Digitalmars-d-learn
mailing list