The Strange Loop conference
Timon Gehr
timon.gehr at gmx.ch
Wed Sep 21 14:31:42 PDT 2011
On 09/21/2011 10:20 PM, Andrei Alexandrescu wrote:
> On 9/21/11 2:29 PM, Timon Gehr wrote:
>> On 09/21/2011 06:55 PM, Andrei Alexandrescu wrote:
>>> I'm back from the Strange Loop conference. It's been an interesting
>>> experience. The audience was very diverse, with interest in everything
>>> functional (you'd only need to say "Haskell" or "monad" to get positive
>>> aahs), Web/cloud/tablet stuff, concurrent and distributed systems.
>>> Mentioning C++ non-mockingly was all but a faux pas; languages like
>>> Scala, Haskell, Clojure, and Erlang got attention. The quality of talks
>>> has been very variable, and unfortunately the
>>> over-confident-but-clueless-speaker stereotype was well represented.
>>>
>>> I gave a talk there
>>> (https://thestrangeloop.com/sessions/generic-programming-galore-using-d)
>>> which has enjoyed moderate audience and success. I uploaded the slides
>>> at http://erdani.com/d/generic-programming-galore.pdf and the video may
>>> be available soon.
>>
>> I am looking forward to it!
>>
>>>
>>> There was a very strong interest in D's CTFE abilities, which we should
>>> consider a strategic direction going forward.
>>
>> One milestone would be to make DMD GC enabled. CTFE string manipulation
>> sucks up too much memory.
>>
>>> Also finalizing D's
>>> concurrency language and library infrastructure is essential. These two
>>> features are key differentiators. Also, capitalizing on D's functional
>>> features (which are e.g. better than Scala's but less known) would add
>>> good value.
>>>
>>
>> Where D still loses when compared to Scala is functional code syntax:
>>
>> val newcol = collection filter {x=>x<5} map {x=>2*x}
>
> Yoda this wrote.
Actually it is the order in which it will (conceptually at least) be
executed =). D can do similar things on arrays with UFCS.
>
>> or maybe
>>
>> val newcol = for(x<-collection if(x<5)) yield 2*x
>
> Too baroque.
>
>> vs
>>
>> auto newrange = filter!((x){return x<5;})(map!((x){return 2*x;})(range));
>
> auto newrange = filter!"a<5"(map!"2*a"(range));
>
> At first some people get the heebiejeebies when seeing string-based
> lambda and the implicit naming convention for unary and binary
> functions.
Yes, I have seen it happen multiple times. There are even people who
consider strings-as-code an evil concept entirely :o). How are CTFE and
string mixins best introduced to people who think they might be too lazy
to bother about learning more about the language?
> More importantly, there's the disadvantage you can't access
> local functions inside a string lambda.
I often want to do that. We could replace the 5 and 2 constants by stack
variables, and then the point would be made.
> We should probably add a
> specialized lambda syntax.
It would probably be a simple addition as it is restricted mostly to the
parser.
Like this? Or is there a better lambda syntax around?
int u,v;
auto newrange=map!(x=>u*x)(filter!(x=>v<x)(range));
auto newrange = range.filter!(x=>v<x).map!(x=>u*x);
>
>> I believe that is part of the reason why it is less known. If I write
>> functional style code in D I unfortunately usually get feedback that it
>> is "extremely hard to read". Furthermore, Scala has built-in tuples, and
>> eg delimited continuations, which enable some more functional
>> programming idioms. std.algorithm/std.range are also considerably (and
>> as I understand, deliberately) underpowered for FP when compared to eg
>> Haskell's standard set of libraries, and writing a good range from
>> scratch is usually a serious undertaking.
>
> I wonder what Scala/Haskell idioms we should borrow for D.
In my opinion these are worth looking into:
Haskell: This might not happen, but having a tiny little function with a
literate name for most common tasks is very convenient. I think other
Haskell idioms not already in D are hard to translate because the type
system and execution model of the two languages are so different. I have
managed to use D for haskell-lookalike toy examples nonetheless. (it
leads to extremely obfuscated code because of many nested lambdas and a
bug in the lazy storage class that needs to be worked around)
Both: (Concise expression-based lambdas.) Pattern matching, if it can be
incorporated in a good way. (dynamic) lazy evaluation. Scala has lazy
val. It would play very nicely with Ds purity, but maybe suboptimally
with immutable (for immutable structures, the lazy fields would have to
be computed eagerly)
Generators? (those are implicit in Haskell) Something like this example
would automatically create a compile-time lazy range to compute a power
set efficiently.
auto powerset(T)(T[] x) {
foreach(i;0..1<<x.length) {
yield (size_t i){
while(i){
yield x[bsf(i)];
i &= i-1;
}
}(i);
}
}
Equivalent code that spells out the nested structs with all the
front/popFront/empty etc contains considerable boilerplate. I am not
sure how powerful it could be, but it should be possible to
automatically let the following example propagate random access iff fun
is pure, based on the observation that it does not have state:
auto map(alias fun, R)(R m){
foreach(x; m) yield unaryFun!fun(x);
}
The range concept is very important in D code, some syntactic sugar like
this would help a lot.
>
>> Another big advantage that Scala has is that it supports pattern
>> matching. It is usually about the first feature functional programmers
>> care about.
>>
>> What do you think is the biggest advantage that Ds functional
>> programming has in comparison to Scala's?
>
> 1. True immutability
>
> 2. True purity
Compiler-enforced immutability and purity.
>
> 3. Pass by alias
>
It is extremely nice how templates are automatically instantiated in the
correct scope. The fact that delegates are constrained to one context
pointer and that static function literals don't decay to delegates tends
to be annoying though. (also, that there is no inference if a context
pointer is needed)
> For a language that has so firmly branded itself as functional, Scala
> has a surprisingly poor handling of immutability and referential
> transparency aka purity. My understanding is that Scala's immutability
> merely consists of final values and a web of conventions. (Please
> correct me if I'm wrong.)
>
I think you are right. But in Scala, much of the language semantics are
actually implemented in the library. The immutable collections could be
considered truly immutable by some.
More information about the Digitalmars-d
mailing list