Future of D

Paulo Pinto pjmlp at progtools.org
Wed Dec 16 13:26:44 UTC 2020


On Wednesday, 16 December 2020 at 10:04:03 UTC, ddcovery wrote:
> On Tuesday, 15 December 2020 at 17:45:20 UTC, a11e99z wrote:
>
>> D is already very complicated for newbies.
>> if u cannot write program (something connect to http/grpc 
>> service) in a few hours than "f*ck it".
>> man need 4-12 months for learning D.
>
> From my personal experience, the complication comes because D 
> libraries and compiler itself follows the "convention" over 
> "contract" way (similar to the "convention" over 
> "configuration" with ruby on rails :-) ).
>
> Example:  Do you need to be equatable... then add an "opEquals" 
> method to your class/struct (operator overload)... you don't 
> need to implement the "IEquatable" or "IComparable" interface.
>
> A first look to ranges libraries (it is really impressive) 
> exposes that it is based on introspection (static/compile time  
> code), not on interfaces/contracts.  This makes it difficult 
> for newbies to understand how it works because there is not a 
> "contract" (an interface) explaining you what it does.   If you 
> try to read de comments in the own library, it is oriented to 
> doc generation:  it is extensive and thought for post processed 
> documentation generation and really impossible (in my case) as 
> a guidance to understand the function signature.  The only way 
> to read this "comments" is navigating to dlang.org web and 
> reading the generated documentation.
>
> This gives the real power and weakness to D:   The missing 
> contracts delegates to the compile-time static code the final 
> real code generation... you need to compile to know if you are 
> developing well, no interfaces/contracts can be used to guide 
> you before this phase.  The problem is clean:  functions 
> signature doesn't gives you enough information to understand 
> what exactly it does and you need 4 or more months to acquire 
> the knowledge (the intuition of the typical developer is not 
> enough: you must work it to adapt)
>
> It is like beginning with Functional programming:  you need to 
> understand what it means before trying to write complex code... 
> and D introduces a new paradigm itself for developers that 
> usually works in "productive" more known ways.
>
> Of course, when you change your way of thinking, D reveals it's 
> real power:  *auto*, *alias*,... the same function can be 
> applied to thinks that are not related.  It's magic? not: D 
> doesn't use generics, it uses templates and templates are not 
> generics.
>
> Newbies need to understand this two main concepts:
> * D is not based in contracts (it can, but it tries not to 
> use):  Type resolution is more "introspection" based than 
> declaration based.
> * D has templates, NOT generics...
>
>
>
> Final conclusion... look at this:
>
> void main(){
>   0.doThis!(n=>assert(n==0));
>   assert( 0.doThis!(n=>n) == 0 );
>   assert( "hello".doThis!(s=>s) == "hello" );
>   assert( "hello".doThis!(s=>s.length) == 5 );
>   assert( doThis!(u=>u)(true) );
> }
> auto doThis(alias f, T)(T value){
>   // Nothing in the "alias f" tells you that it must be an 
> unary function or
>   // witch type must return...
>   return f(value);
> }
>
> Someone coming from java or c# will suffer an aneurysm, but it 
> is really... wonderful? :-)

You mean like this, yeah it is a bit more boilerplate, but no I 
didn't suffer an aneurysm

using System;
using System.Linq.Expressions;


public static class Helpers
{
	public static R dothis<T, R>(this T val, Expression<Func<T,R>> f)
	{
		var func = f.Compile();
		return func(val);
	}
	
	public static void dothis<T>(this T val, Expression<Action<T>> f)
	{
		var func = f.Compile();
		func(val);
	}
}

public class Program
{
	public static void Main()
	{
		0.dothis(n => assert(() => n == 0));
		System.Diagnostics.Debug.Assert(0.dothis(n => n) == 0);
		System.Diagnostics.Debug.Assert("hello".dothis(n => n) == 
"hello");
		System.Diagnostics.Debug.Assert(Helpers.dothis(true, n => n));
	}
	
	public static void assert(Expression<Func<bool>> exp) {
		var expc = exp.Compile();
		System.Diagnostics.Debug.Assert(expc());
	}
}




More information about the Digitalmars-d mailing list