Functional Programming with D
qznc
qznc at web.de
Sat Apr 13 23:35:53 PDT 2013
Sat, 13 Apr 2013 17:38:24 -0700: Ali Çehreli wrote
> On 04/13/2013 05:29 AM, qznc wrote:
>> I wrote a small article to summarize D's suitability for functional
>> programming.
>>
>> http://beza1e1.tuxen.de/articles/functional_D.html
>>
>> Feedback welcome! :)
>>
>>
> Nice article; thanks. :)
>
> Some quotes from the article and some notes:
>
> 1) "can qualify variables as immutable, which is similiar to C's const"
>
> D's immutable is similar to C's const only when we are talking about
> values:
>
> const int c_i = 42; // in C immutable d_i = 42; // in D
>
> When it is a reference though, not immutable but D's const is similar to
> C's const. Otherwise, there is the following difference:
>
> // in C: I have no idea whether c is immutable void foo(const int *
> c);
>
> // in D: I know d is immutable void foo(immutable const ref d);
>
> (Actually, not only I "know", but I "demand" that d is immutable.)
The C variant is an mutable pointer to an immutable int. What is not to
know about that?
> 2) "if you have a function which does not mutate an argument, then
> qualify it const, but not immutable"
>
> I had arrived the same conclusion (and have been spreading it too :)).
>
> Actually, the choice is not that clear: If the function is going to need
> an immutable copy of a reference parameter anyway, then it is better
> that it goes ahead and takes an immutable reference parameter:
>
> void foo(immutable(int)[] numbers);
>
> The benefit is, if the caller already has an immutable slice, then that
> slice gets passed as the argument. That is the fastest... On the other
> hande, if the caller does not have an immutable slice, then the caller
> makes one and passes the new copy. Nothing is lost: The copy that the
> function would have to make has been made by caller.
>
> Although that seems like an implementation detail of the function
> leaking out, and it really is, it is not that bad if we view it like
> this: What is happening is that the function is working with its caller
> to get more performance.
I agree with you. However, it is too much detail for the article.
> 3) "D does not allow you to cast something to immutable"
>
> I think you mean "no implicit conversion" because it is not true if we
> take what you said literally:
>
> auto a = [ 1, 2 ];
> immutable i = cast(immutable)a; // dangerous
>
> a[0] = 42;
> assert(i[0] == 42); // oops: immutable element has changed!
I clarified this in the article. Thanks for pointing it out. :)
More information about the Digitalmars-d-announce
mailing list