Short overview on D
Rikki Cattermole via Digitalmars-d
digitalmars-d at puremagic.com
Sun Aug 3 04:52:39 PDT 2014
On 3/08/2014 10:57 p.m., Bayan Rafeh wrote:
> Wow clearly I misunderstood a lot of stuff.
>
> On Sunday, 3 August 2014 at 08:07:04 UTC, Rikki Cattermole wrote:
>> On 3/08/2014 7:36 p.m., Bayan Rafeh wrote:
>>> A small background on this:
>>>
>>> I'm a university student about to start my graduation project with two
>>> teammates, both of which have a C/Java/Python background and I suggested
>>> we use D for our project. They're not familiar with it, so I wrote a
>>> short tutorial for them here: https://github.com/bayanr/d-tutorial.
>>>
>>> I wanted to see what you guys thought, and if this could be a useful
>>> introduction for people with similar backgrounds. It's a first draft so
>>> it probably has a lot of mistakes, omissions, etc. so any criticism
>>> is welcome.
>>
>> Your introduction to templates is far too simplistic.
>> What you introduced was template blocks. But showing them as templated
>> classes.
>> There is also templated functions, methods ext. After all.
>> It may also be wise to introduce CTFE as well. But not so important.
> That's definitely going in there but I'm just making sure I fix
> everything I have so far. If the responses so far are any indication
> there is a lot of fixing that needs to be done.
>
>>
>> I.e.
>>
>> class ArrayList(T) {
>> T[] l;
>> }
>>
>> alias IntList = ArrayList!int;
>> IntList list = new IntList();
>>
>> would probably be better.
>
> Could you give any suggestions for some example use cases that can
> properly demo templates? If not I'll think of some.
Templates are a very complex beast to give examples for. But here are
some simple ones:
1.
class Something : ASomething {
void dosomething(T : ASomething2)(T value) {
import std.stdio;
writeln(value.getter);
}
}
2.
class List(T : Object) {
T[] items;
}
3.
std.regex.ctRegex (I'll let you grab that).
4.
Dump from a side project I'm working on.
module dwc.interfaces.eventable;
import std.string : toUpper;
import std.algorithm : filter, moveAll;
/**
* Provides an interface version of an eventing mechanism.
*
* See_Also:
* Eventing
*/
mixin template IEventing(string name, T...) {
mixin("void add" ~ toUpper(name[0] ~ "") ~ name[1 ..$] ~ q{(bool
delegate(T));});
mixin("void add" ~ toUpper(name[0] ~ "") ~ name[1 ..$] ~ q{(void
delegate(T));});
mixin("void remove" ~ toUpper(name[0] ~ "") ~ name[1 ..$] ~ q{(bool
delegate(T));});
mixin("void remove" ~ toUpper(name[0] ~ "") ~ name[1 ..$] ~ q{(void
delegate(T));});
mixin("void " ~ name ~ q{(T args);});
mixin("void clear" ~ toUpper(name[0] ~ "") ~ name[1 ..$] ~ q{(T args);});
static if (T.length > 0) {
static if (__traits(compiles, typeof(this)) && is(typeof(this) : T[0])) {
mixin("void " ~ name ~ q{(T[1 .. $] args);});
}
}
}
/**
* Implements an eventable interface for something.
* Includes support for bool delegate(T) and void delegate(T).
* Will consume a call to all delegates if it returns true. Default false.
*
* Example usage:
* mixin Eventing!("onNewListing", ListableObject);
*
* If is(T[0] == typeof(this)) then it'll use this as being the first
argument.
*/
mixin template Eventing(string name, T...) {
mixin(q{bool delegate(T)[] } ~ name ~ "_;");
mixin(q{bool delegate(T)[void delegate(T)] } ~ name ~ "_assoc;");
mixin("void add" ~ toUpper(name[0] ~ "") ~ name[1 ..$] ~ q{(void
delegate(T) value) {
mixin(name ~ "_ ~= (T args) => {value(args); return false;}();");
mixin(name ~ "_assoc[value] = " ~ name ~ "_[$-1];");
}});
mixin("void add" ~ toUpper(name[0] ~ "") ~ name[1 ..$] ~ q{(bool
delegate(T) value) {
mixin(name ~ "_ ~= value;");
}});
mixin("void remove" ~ toUpper(name[0] ~ "") ~ name[1 ..$] ~ q{(bool
delegate(T) value) {
mixin("moveAll(filter!(a => a !is value)(" ~ name ~ "_), " ~ name ~
"_);");
}});
mixin("void remove" ~ toUpper(name[0] ~ "") ~ name[1 ..$] ~ q{(void
delegate(T) value) {
mixin("moveAll(filter!(a => a !is " ~ name ~ "_assoc.get(value,
null))(" ~ name ~ "_), " ~ name ~ "_);");
}});
mixin("void " ~ name ~ q{(T args) {
foreach (del; mixin(name ~ "_")) {
del(args);
}
}});
mixin("void clear" ~ toUpper(name[0] ~ "") ~ name[1 ..$] ~ q{(T args) {
mixin(name ~ "_") = [];
}});
static if (__traits(compiles, typeof(this)) && is(typeof(this) : T[0])) {
mixin("void " ~ name ~ q{(T[1 .. $] args) {
foreach (del; mixin(name ~ "_")) {
if (del(this, args))
return;
}
}});
} else {
mixin("void " ~ name ~ q{(T args) {
foreach (del; mixin(name ~ "_")) {
if (del(args))
return;
}
}});
}
}
>> Everything else looks good including mixin templates. But just for
>> food for thought. With statements are cool.
>
> I'll be sure to add those as well. I just remembered I forgot to add
> scope too.
With statements are just so neat in my opinion. Just think of the
possibilities for GWT like libraries.
WebPage page;
with(page ~= new Layout) {
with(~= new Button) {
label = "Some text";
}
type = Layouts.Sequential;
//...
}
>>
>> Hope to hear more of how the project goes.
>
> We're presenting at the end of the next spring semester, I'll be sure to
> share it here once it's complete.
>
>
>> -- Functions --
>>
>>> Ref implies the type is a reference type, i.e. changes inside the
>>> functions will change the variable outside the function. in means
>>> immutable out is an alias for ref(preferably used for parameters)
>>
>> `ref` doesn't "imply" a reference, it "declares" or "states" or
>> something.
> I'm basing this on the wiki: http://dlang.org/function.html
> "ref parameter is passed by reference"
>
> If that is not the case, in practical terms what does that mean exactly?
ref is like how in c++ has &var for function arguments. Basically passes
a value by pointer while not requiring you on the caller end to pass by
pointer and at the callee end use it as a pointer.
>> `in` doesn't mean immutable, it means scope const.
>> `out` is similar to `ref`, but it's not an alias. Unlike `ref`,
>> an out "parameter is initialized upon function entry with the
>> default value for its type".
>>
> Sorry I'll fix those shortly.
>> -- Operator Overloading --
>>
>> The wording suggests that the list of operators is supposed to be
>> exhaustive. It's not.
>>
> I intended it to be comprehensive(with regard to types at least). What
> am I missing regarding the different types of operators besides the
> opAssigns?
>
>>> unitary
>>
>> unary
>>
> Ah crap, ok will fix that as well.
>> -- Templates --
>>
>>> Templates are D's response to Java generics and C++ templates.
>>
>> At least put C++ first if you have to include Java ;)
>>
> Riots would ensue. To put it lightly we're not fans of C++. Well we're
> not exactly fans of Java either :p
>
>>> Basically templates are metaclasses that take types as parameters.
>>
>> Template parameters are not restricted to types. They can also be
>> values or symbols.
>>
> I guess I need a more exhaustive list of examples.
>
>>> alias List!int.ArrayList IntList;
>>
>> Maybe use the more fashionable assignment syntax:
>> alias IntList = List!int.ArrayList;
>>
>> -- Arrays --
>>
>>> a[x..y] is an array containing a[x] all the way to a[y]
>>
>> To avoid confusion: all the way up to, but not including, a[y].
>
> Will fix that as well.
>
> PS. I applied some of the changes, though I left the stuff that I need
> clarification on.
>
> Thank you very much for the comments so far, please keep them coming.
More information about the Digitalmars-d
mailing list