spir:

> As a way to start learning D by practicing, I'm trying to implement a symbol 
> table as linked list: see prototype code of the structs below. (Hints about 
> good D coding welcome :-)

I have modified your code a little:

struct Symbol {
    string name;
    int element;
    Symbol* next;

    this(string n, int e, Symbol* s=null) {
        name = n;
        element = e;
        next = s;
    }
}

struct List {
    Symbol* first;

    int element(string name) {
        for (auto symbol = this.first; symbol != null; symbol = symbol.next)
            if (symbol.name == name)
                return symbol.element;
        return 0;
    }
}

void main() {
    auto l = List(new Symbol("baz", 3, new Symbol("bar", 2, new Symbol("foo", 
1))));
    assert(l.element("bar") == 2);
}

- There's no need to initialize int to 0, string to "", pointers to null, etc, 
the compiler does it for you on default. Each type has a default init value 
(for floating point values it uses a NaN).
- Generally don't put a space before the ending semicolon.
- Four spaces indent and no space before the "*" of the pointer, as you have 
done, is OK.
- Using a while loop as you have done is OK, I have used a for loop just to 
show a shorter alternative.
- It's generally better to put one or two blank lines before structs, 
functions, etc
- (*symbol).name is written symbol.name in D.
- After an { generally a \n is used, there's no need to use the ; after the }
- using 0 as error return value is sometimes OK, but also keep in mind that 
exceptions are present.
- while(symbol) is acceptable, but some people prefer to put an explicit 
comparison to make the code more readable.
- sometimes using "auto" helps.
- In D linked lists are doable, but much less used, think about using a dynamic 
array, or even in this case an associative array:

void main() {
    auto aa = ["foo": 1, "bar": 2, "baz": 3];
    assert(aa["bar"] == 2);
}


> 1. To please the compiler, I had to wrap dereferencing in parens, like in 
> "(*symbol).name". Is this just normal (for disambiguation)?
> 2. Just noticed the compiler accepts "symbol.name", while symbol is a 
> pointer: is there implicit dereferencing of pointers to structs? If yes, does 
> this also apply to pointers to arrays (for information, this what Oberon 
> does).

Generally the field dereferencing doesn't require the "(*symbol).name", in D 
you use "symbol.name".
Pointers to arrays are possible, but quite uncommon in D.


> And a note: had forgotten to add an empty main(), just for compiling: the 
> linker produced a rather big amount of error text without any hint to the 
> actual issue. Maybe dmd could cope with that before calling gcc?

I agree, I have bug report 4680 open on something similar:
http://d.puremagic.com/issues/show_bug.cgi?id=4680


> Finally: the reference is rather harsh for me, esp there are very few example 
> (I have few practice of C, and none of C++); the bits of tutorials I found 
> are too light or just started (toc points to empty pages). Is there anywhere 
> online a kind of D programming guide, even not polished or possibly 
> unfinished (I know about the book; maybe I'll order it, but in meantime...).

The D2 documentation isn't abundant yet :-)

Bye,
bearophile

Reply via email to