New programming paradigm
    Jesse Phillips via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Thu Sep  7 08:36:47 PDT 2017
    
    
  
On Monday, 4 September 2017 at 03:26:23 UTC, EntangledQuanta 
wrote:
> To get a feel for what this new way of dealing with dynamic 
> types might look like:
>
> void foo(var y) { writeln(y); }
>
> var x = "3"; // or possibly var!(string, int) for the explicit 
> types used
> foo(x);
> x = 3;
> foo(x);
>
> (just pseudo code, don't take the syntax literally, that is not 
> what is important)
>
> While this example is trivial, the thing to note is that there 
> is one foo declared, but two created at runtime. One for string 
> and one for and int. It is like a variant, yet we don't have to 
> do any testing. It is very similar to `dynamic` in C#, but 
> better since actually can "know" the type at compile time, so 
> to speak. It's not that we actually know, but that we write 
> code as if we knew.. it's treated as if it's statically typed.
It is an interesting thought but I'm not sure of its utility. 
First let me describe how I had to go about thinking of what this 
means. Today I think it would be possible for a given function 
'call()' to write this:
     alias var = Algebraic!(double, string);
     void foo(var y) {
         mixin(call!writeln(y));
     }
Again the implementation of call() is yet to exist but likely 
uses many of the techniques you describe and use.
Where I'm questioning the utility, and I haven't used C#'s 
dynamic much, is with the frequency I'm manipulating arbitrary 
data the same, that is to say:
     auto m = var(4);
     mixin(call!find(m, "hello"));
This would have to throw a runtime exception, that is to say, in 
order to use the type value I need to know its type.
A couple of additional thoughts:
The call() function could do something similar to pattern 
matching but args could be confusing:
     mixin(call!(find, round)(m, "hello"));
But I feel that would just get confusing. The call() function 
could still be useful even when needing to check the type to know 
what operations to do.
     if(m.type == string)
         mixin(call!find(m, "hello"));
instead of:
     if(m.type == string)
         m.get!string.find("hello");
    
    
More information about the Digitalmars-d-learn
mailing list