diff options
| author | Luis Custodio <luis.custodio@gmail.com> | 2015-10-17 13:11:25 +0200 | 
|---|---|---|
| committer | Luis Custodio <luis.custodio@gmail.com> | 2015-10-17 13:11:25 +0200 | 
| commit | f5873b08901bfaec3fb46518258ff9e886fd04c4 (patch) | |
| tree | 62886b71c7226f0c6c4f979d61ff96c839a641a9 /d.html.markdown | |
| parent | c9348e5a82b639093f8f3eee955ffdf6fb99b5d8 (diff) | |
| parent | 0e6d9f6fe9aeffc64c3adad3e4a0ee1cc0d1dd88 (diff) | |
Merge branch 'master' of github.com:adambard/learnxinyminutes-docs
Diffstat (limited to 'd.html.markdown')
| -rw-r--r-- | d.html.markdown | 103 | 
1 files changed, 57 insertions, 46 deletions
| diff --git a/d.html.markdown b/d.html.markdown index daba8020..80c1dc65 100644 --- a/d.html.markdown +++ b/d.html.markdown @@ -1,6 +1,6 @@  --- -language: D  -filename: learnd.d  +language: D +filename: learnd.d  contributors:      - ["Nick Papanastasiou", "www.nickpapanastasiou.github.io"]  lang: en @@ -18,13 +18,15 @@ void main(string[] args) {  }  ``` -If you're like me and spend way too much time on the internet, odds are you've heard  +If you're like me and spend way too 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 support for everything from low-level features to  +multi-paradigm language with support for everything from low-level features to  expressive high-level abstractions. -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 is actively developed by a large group of super-smart people and is spearheaded by +[Walter Bright](https://en.wikipedia.org/wiki/Walter_Bright) and +[Andrei Alexandrescu](https://en.wikipedia.org/wiki/Andrei_Alexandrescu). +With all that out of the way, let's look at some examples!  ```c  import std.stdio; @@ -36,9 +38,10 @@ void main() {          writeln(i);      } -    auto n = 1; // use auto for type inferred variables -     -    // Numeric literals can use _ as a digit seperator for clarity +    // 'auto' can be used for inferring types. +    auto n = 1; + +    // Numeric literals can use '_' as a digit separator for clarity.      while(n < 10_000) {          n += n;      } @@ -47,13 +50,15 @@ void main() {          n -= (n / 2);      } while(n > 0); -    // For and while are nice, but in D-land we prefer foreach -    // The .. creates a continuous range, excluding the end -    foreach(i; 1..1_000_000) {  +    // For and while are nice, but in D-land we prefer 'foreach' loops. +    // The '..' creates a continuous range, including the first value +    // but excluding the last. +    foreach(i; 1..1_000_000) {          if(n % 2 == 0)              writeln(i);      } +    // There's also 'foreach_reverse' when you want to loop backwards.      foreach_reverse(i; 1..int.max) {          if(n % 2 == 1) {              writeln(i); @@ -69,16 +74,18 @@ are passed to functions by value (i.e. copied) and classes are passed by referen  we can use templates to parameterize all of these on both types and values!  ```c -// Here, T is a type parameter. Think <T> from C++/C#/Java +// Here, 'T' is a type parameter. Think '<T>' from C++/C#/Java.  struct LinkedList(T) {      T data = null; -    LinkedList!(T)* next; // The ! is used to instaniate a parameterized type. Again, think <T>  + +    // Use '!' to instantiate a parameterized type. Again, think '<T>'. +    LinkedList!(T)* next;  }  class BinTree(T) {      T data = null; -     -    // If there is only one template parameter, we can omit parens + +    // If there is only one template parameter, we can omit the parentheses.      BinTree!T left;      BinTree!T right;  } @@ -93,37 +100,34 @@ enum Day {      Saturday,  } -// Use alias to create abbreviations for types - +// Use alias to create abbreviations for types.  alias IntList = LinkedList!int;  alias NumTree = BinTree!double;  // We can create function templates as well! -  T max(T)(T a, T b) { -    if(a < b)  +    if(a < b)          return b;      return a;  } -// Use the ref keyword to ensure pass by referece. -// That is, even if a and b are value types, they -// will always be passed by reference to swap +// Use the ref keyword to ensure pass by reference. That is, even if 'a' and 'b' +// are value types, they will always be passed by reference to 'swap()'.  void swap(T)(ref T a, ref T b) {      auto temp = a;      a = b; -    b = temp;  +    b = temp;  } -// With templates, we can also parameterize on values, not just types +// With templates, we can also parameterize on values, not just types.  class Matrix(uint m, uint n, T = int) {      T[m] rows;      T[n] columns;  } -auto mat = new Matrix!(3, 3); // We've defaulted type T to int +auto mat = new Matrix!(3, 3); // We've defaulted type 'T' to 'int'.  ``` @@ -133,25 +137,24 @@ have the syntax of POD structures (`structure.x = 7`) with the semantics of  getter and setter methods (`object.setX(7)`)!  ```c -// Consider a class parameterized on a types T, U - +// Consider a class parameterized on types 'T' & 'U'.  class MyClass(T, U) {      T _data;      U _other; -  } -// And "getter" and "setter" methods like so +// And "getter" and "setter" methods like so:  class MyClass(T, U) {      T _data;      U _other; -     -    // Constructors are always named `this` + +    // Constructors are always named 'this'.      this(T t, U u) { +        // This will call the setter methods below.          data = t;          other = u;      } -     +      // getters      @property T data() {          return _data; @@ -161,7 +164,7 @@ class MyClass(T, U) {          return _other;      } -    // setters     +    // setters      @property void data(T t) {          _data = t;      } @@ -170,16 +173,24 @@ class MyClass(T, U) {          _other = u;      }  } -// And we use them in this manner +// And we use them in this manner:  void main() { -    auto mc = MyClass!(int, string); +    auto mc = new MyClass!(int, string)(7, "seven"); + +    // Import the 'stdio' module from the standard library for writing to +    // console (imports can be local to a scope). +    import std.stdio; -    mc.data = 7; -    mc.other = "seven"; -     -    writeln(mc.data); -    writeln(mc.other); +    // Call the getters to fetch the values. +    writefln("Earlier: data = %d, str = %s", mc.data, mc.other); + +    // Call the setters to assign new values. +    mc.data = 8; +    mc.other = "eight"; + +    // Call the getters again to fetch the new values. +    writefln("Later: data = %d, str = %s", mc.data, mc.other);  }  ``` @@ -193,7 +204,7 @@ and `override`ing methods. D does inheritance just like Java:  Extend one class, implement as many interfaces as you please.  We've seen D's OOP facilities, but let's switch gears. D offers -functional programming with first-class functions, `pure`  +functional programming with first-class functions, `pure`  functions, and immutable data. In addition, all of your favorite  functional algorithms (map, filter, reduce and friends) can be  found in the wonderful `std.algorithm` module! @@ -205,7 +216,7 @@ import std.range : iota; // builds an end-exclusive range  void main() {      // We want to print the sum of a list of squares of even ints      // from 1 to 100. Easy! -     +      // Just pass lambda expressions as template parameters!      // You can pass any old function you like, but lambdas are convenient here.      auto num = iota(1, 101).filter!(x => x % 2 == 0) @@ -216,12 +227,12 @@ void main() {  }  ``` -Notice how we got to build a nice Haskellian pipeline to compute num?  +Notice how we got to build a nice Haskellian pipeline to compute num?  That's thanks to a D innovation know as Uniform Function Call Syntax.  With UFCS, we can choose whether to write a function call as a method  or free function call! Walter wrote a nice article on this -[here.](http://www.drdobbs.com/cpp/uniform-function-call-syntax/232700394)  -In short, you can call functions whose first parameter  +[here.](http://www.drdobbs.com/cpp/uniform-function-call-syntax/232700394) +In short, you can call functions whose first parameter  is of some type A on any expression of type A as a method.  I like parallelism. Anyone else like parallelism? Sure you do. Let's do some! | 
