Re: "macro" expansion to build switch case code

2023-07-02 Thread Steven Schveighoffer via Digitalmars-d-learn

On 7/2/23 1:02 PM, Paul wrote:
I have a struct similar to the following example.  I'd like to build an 
adder method without having to code the whole method. How do I use the D 
language to do this?  Template, mixins, CTFE..all of them?


```d
struct myS {
     int a, b, c, d, e, f, g, h, i;
     adder(string s, int n) {
     final switch (s) {
     case "aa" :
     a += n; break;
     case "bb" :
     b += n; break;
    ...
```
Thanks for any assistance.


Use a static foreach:

```d
import std.traits; // for FieldNameTuple. there are other ways, but this 
is the most straightforward

switchlabel: // this is needed for break inside a static foreach
final switch(s) {
   static foreach(mem; FieldNameTuple!myS) {
 case mem ~ mem:
__traits(getMember, this, mem) += n;
break switchalbel;
   }
}
```

-Steve


Re: "macro" expansion to build switch case code

2023-07-02 Thread kdevel via Digitalmars-d-learn

On Sunday, 2 July 2023 at 17:02:44 UTC, Paul wrote:
I have a struct similar to the following example.  I'd like to 
build an adder method without having to code the whole method.  
How do I use the D language to do this?  Template, mixins, 
CTFE..all of them?


```d
struct myS {
int a, b, c, d, e, f, g, h, i;
adder(string s, int n) {
final switch (s) {
case "aa" :
a += n; break;
case "bb" :
b += n; break;
   ...
```
Thanks for any assistance.


Thanks for your interesting question!

```
module mys;
import std.exception;

class UnknownRegister : Exception {
   mixin basicExceptionCtors;
}

enum string [] DefaultRegisterSet = [
  "a", "b", "c", "d", "e", "f", "g", "h", "i"
   ];

struct myS {
   int [string] registers;

   this (string [] register_names)
   {
  foreach (r; register_names)
 registers [r] = 0;
   }

   void adder (string s, int n)
   {
  auto p = s in registers;
  enforce!UnknownRegister (p);
  *p += n;
   }

   int opDispatch (string s) ()
   {
  auto p = s in registers;
  enforce!UnknownRegister (p);
  return *p;
   }
}

unittest {
   auto m = myS (DefaultRegisterSet);
   m.adder ("a", 7);
   m.adder ("a", 8);
   assert (m.a == 15);
   assertThrown!UnknownRegister (m.adder ("j", -1));
   assertThrown!UnknownRegister (m.j == 0);
}
```


Re: "macro" expansion to build switch case code

2023-07-02 Thread nbdusr via Digitalmars-d-learn

On Sunday, 2 July 2023 at 17:02:44 UTC, Paul wrote:
I have a struct similar to the following example.  I'd like to 
build an adder method without having to code the whole method.  
How do I use the D language to do this?  Template, mixins, 
CTFE..all of them?


```d
struct myS {
int a, b, c, d, e, f, g, h, i;
adder(string s, int n) {
final switch (s) {
case "aa" :
a += n; break;
case "bb" :
b += n; break;
   ...
```
Thanks for any assistance.


https://forum.dlang.org/post/rqgvruwgrldklarab...@forum.dlang.org


"macro" expansion to build switch case code

2023-07-02 Thread Paul via Digitalmars-d-learn
I have a struct similar to the following example.  I'd like to 
build an adder method without having to code the whole method.  
How do I use the D language to do this?  Template, mixins, 
CTFE..all of them?


```d
struct myS {
int a, b, c, d, e, f, g, h, i;
adder(string s, int n) {
final switch (s) {
case "aa" :
a += n; break;
case "bb" :
b += n; break;
   ...
```
Thanks for any assistance.


Re: IntelliJ D language plugin

2023-07-02 Thread Dmitry Olshansky via Digitalmars-d-learn
On Friday, 30 June 2023 at 16:26:26 UTC, Richard (Rikki) Andrew 
Cattermole wrote:

I use it and contribute to it ;)


Thanks to Rikki I was able to figure it out.

—
Dmitry Olshansky
https://olshansky.me