--- language: D filename: learnd.d contributors: - ["Nick Papanastasiou", "www.nickpapanastasiou.github.io"] lang: en --- If you're like me and spend way to much time on the internet, odds are you've heard about [D](http://dlang.org/). The D programming language is a modern, general-purpose, multi-paradigm language with fantastic support for OOP, functional programming, metaprogramming, and easy concurrency and parallelism, and runs the gamut from low-level features such as memory management, inline assembly, and pointer arithmetic, to high-level constructs such as higher-order functions and generic structures and functions via templates, all with a pleasant syntax, and blazing fast performance! D is actively developed by Walter Bright and Andrei Alexandrescu, two super smart, really cool dudes. With all that out of the way, let's look at some examples! ```d // You know what's coming... import std.stdio; // args is optional void main(string[] args) { writeln("Hello, World!"); } // Conditionals and loops work as expected. import std.stdio; void main() { for(int i = 0; i < 5; i++) { writeln(i); } auto n = 1; // use auto for type inferred variables while(n < 10_000) { n += n; } do { n -= (n / 2); } while(n > 0); // For and while are nice, but in D-land we prefer foreach foreach(i; 1..int.max) { // The .. creates a continuous range if(n % 2 == 0) writeln(i); } foreach_reverse(i; 1..short.max) { if(n % 2 == 1) writeln(i); else writeln("No!"); } } ``` We can define new types and functions with `struct`, `class`, `union`, and `enum`. Structs and unions are passed to functions by value (i.e. copied) and classes are passed by reference. Futhermore, we can use templates to parameterize all of these on both types and values! ```d // Here, T is a type parameter. Think from C++/C#/Java struct(T) LinkedList { T data = null; LinkedList!(T)* next; // The ! is used to instaniate a parameterized type. Again, think } class BinTree(T) { T data = null; BinTree!T left; BinTree!T right; } enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, } // Use alias to create abbreviations for types alias IntList = LinkedList!int; alias NumTree = BinTree!double; ```