spir:

> (Hope you don't mind if I send other bits of code to be improved that way?)

Feel free to show them, if I am busy other people may give you an answer. The 
worst that may happen is that no one answers you.


> Right. I think at keeping explicit defaults like "int element = 0" for 
> documentation.

Not putting a value, unless it's different from the standard initializator, is 
a very common idiom in D. It's easy to remember the inits: zero, empty string, 
NaN, null, invalid Unicode chars.


> If I ever write a lib for public use, I'll follow such styling guidelines ;-)

The D style:
http://www.digitalmars.com/d/2.0/dstyle.html


> Wouldn't have ever thought that the "stepping" statement of a for loop can be 
> something else as incrementation.

This is a kind of incrementation:
symbol = symbol.next;

In C-derived languages this line of code:
symbol = symbol + 5;
May be written:
symbol += 5;

In the same way you may think of this (this is not D syntax):
symbol .= next;
As a compact version of:
symbol = symbol.next;


> Right, guess you mean while(symbol != null)?

Right. But some people don't like that.


> I need to explore this further (what's the actual purpose of "auto").

It just asks the compiler to use the default type, it performs a bit of local 
type inferencing.


> For curiosity, I intend to benchmark lists vs sequential arrays vs 
> associative arrays, for various element counts.

Good, it's a way to understand the language better. In the lists vs dynamic 
array I suggest you to also take a look at the produced (dis)assembly.


> to know what kind of data structures were suited for symbol tables 
> representing the content of record-like objects, which number of entries is 
> typically small since hand-written by the programmer: sophisticated 
> structures like associative arrays and tries started to perform better than 
> plain sequences for counts >> 100.)<

D dynamic arrays are not bad, but they are not very efficient, so a sequential 
scan in a small array of integer numbers is faster than an hash search.

You may also try a "perfect hash", for your purpose. Around you may find C code 
(that's easy to translate to D) to create a perfect hash out of a sequence of 
strings.

A binary search in an array of strings-int pairs is an easy option too.

If your symbol are names are short you may also put your string+int pairs in a 
single flat data structure (even keeping a fixed length for each one of them), 
to increase CPU cache locality a bit, something like:

struct Pair { char[10] name; int element; }
Pair[20] data;

In C/C++/D languages usually there are *many* complicated ways to speed up code 
:-) You generally want to use them only in the spots where the profiler tells 
you you need performance. The profiler is used with the DMD -profile switch.

It's also good if you learn D to start using unittests and design by contract 
from the beginning. They help a lot avoid bugs. And the more hairy (pointers, 
etc) your code is, the more useful they are.

Bye,
bearophile

Reply via email to