How to insert code in place with templates/mixins?

rempas rempas at tutanota.com
Mon Dec 20 08:45:50 UTC 2021


Here I am having a problem with templates again. No matter how 
much I read, I can't seem to understand how templates/mixins 
work. So I'm having the following code (just a snippet of the 
real code):

```
     if (c != '%') {
       if (stdout_index < STDOUT_BUF_LEN) {
         stdout_buffer[stdout_index++] = c;
         continue;
       } else {
         sys_write(1, stdout_buffer.ptr, cast(i32)stdout_index);
         stdout_index = 0;
         stdout_buffer[stdout_index++] = c;
         continue;
       }
     }
```

And I want to create a macro (using the C terms) to make the code 
inside the first if statement (`if (c != '%')`) into a template 
that will be able to used and added in place (not as a function 
as I don't want to function call). I tried to make it both a 
template and a mixin template and It will not compile, rather it 
will give my the following error:

```
Error: declaration expected, not `if`
Error: declaration expected, not `continue`
Error: declaration expected, not `else`
Error: basic type expected, not `0`
Error: found `0` when expecting `;`
Error: no identifier for declarator 
`stdout_buffer[stdout_index++]`
Error: declaration expected, not `=`
Error: declaration expected, not `continue`
Error: unrecognized declaration
```

It should be clear what I tried to still I will post what I tried 
in case someone is curious to see:

```
mixin template add_char() {
   if (stdout_index < STDOUT_BUF_LEN) {
     stdout_buffer[stdout_index++] = c;
     continue;
   } else {
     sys_write(1, stdout_buffer.ptr, cast(i32)stdout_index);
     stdout_index = 0;
     stdout_buffer[stdout_index++] = c;
     continue;
   }
}
```

So any ideas why this doesn't work?


More information about the Digitalmars-d-learn mailing list