Future of string lambda functions/string predicate functions

Dejan Lekic dejan.lekic at gmail.com
Wed Aug 7 04:33:25 PDT 2013


On Tuesday, 6 August 2013 at 09:05:57 UTC, Jakob Ovrum wrote:
> In Phobos pull request #1453 (Implement chunkBy.)[1], the topic 
> of string lambda functions has again cropped up. I think we 
> should clearly decide on some things regarding them. Questions 
> such as; are they a worthwhile alternative in the present 
> language? Should they be deprecated? Should they be supported 
> in new additions to Phobos?
>
> Some background: string lambda functions are a feature of 
> std.functional/std.range/std.algorithm, where strings can be 
> passed in lieu of functions as template alias arguments to 
> various public functions in these modules. The string becomes 
> the return expression of an anonymous function which implicitly 
> has one or two arguments, named "a" and "b", like the string "a 
> < 3" in the following example expression:
>
>   arr.filter!"a < 3"
>
> When this feature was developed, there were no lambda function 
> literals in the language. There were anonymous functions, but 
> their syntactical overhead means they fare poorly as a 
> replacement for lambda functions:
>
>   arr.filter!((a) { return a < 3; })
>
> The effect is particularly jarring in bigger compositions:
>
>   assert([ 1, 2, 3, 4, 5 ].filter!((a) { return a < 3; 
> }).equal([1, 2]));
>
> Since then, a first-class lambda syntax has been introduced, 
> with significantly less syntactic overhead:
>
>   arr.filter!(a => a < 3)
>
> The issue is then: is the old string lambda syntax obsolete in 
> the face of the new lambda literals?
>
> ----------
>
> My opinion on the matter is that the *only* advantage of string 
> lambdas is that they are (even) shorter than the new lambda 
> syntax. However, I don't think that comes even close to making 
> up for its many disadvantages; here are the ones I think are 
> the biggest:
>
>  * The number one reason string lambdas are shorter is because 
> they implicitly introduce their parameters. However, this means 
> that you're always stuck with the generic, uninformative 
> parameter names "a" and "b".
>  * To the uninitiated, they may not look like code. They 
> certainly aren't highlighted as D code in your average code 
> editor (the q{} literal deserves a mention, but then some of 
> the succinctness advantage is lost and it's not just for D 
> code), and the magically, implicitly introduced variables "a" 
> and "b" is something you plain just have to know beforehand to 
> understand.
>  * Apart from "a" and "b", they can only access symbols that 
> are visible in the scope of the std.functional module.
>
> In light of the above points, I just find them excessively 
> arcane - something new D programmers shouldn't have to learn 
> and thus none of us should continue to use or promote. The 
> symbols you can access in a string lambda are determined by the 
> implementation details of std.functional and thus, may change 
> at any time. It is then only reasonable to recommend that the 
> programmer should not depend on any symbols except for "a" and 
> "b", severely limiting the utility of string lambdas. Also, 
> they only exist in unary and binary forms at present, which 
> means new functions with different requirements cannot leverage 
> them. And then comes the point about consistency; if the 
> utility of string lambdas is so limited in the face of the 
> general lambda literal syntax, foregoing string lambdas in 
> favour of lambda literals helps code consistency.
>
> I can also think of some relatively minor disadvantages of 
> string lambdas, such as the compile-time performance cost they 
> incur.
>
> I think string lambdas were a valiant effort to fill a glaring 
> hole in the language at the time, but are now superseded by an 
> overall superior alternative. The cognitive and maintenance 
> load on programmers is not worth their marginal utility. I 
> think we should deprecate string lambdas altogether.
>
> Specifically, I suggest the following deprecation path:
>
>  * Add deprecation notes to std.functional's unaryFun and 
> binaryFun so users are dissuaded from using them in new code. 
> In time, we would remove their documentation.
>  * Leave support for string lambdas in existing Phobos 
> functions for the foreseeable future, for 
> backwards-compatibility purposes.
>  * Change all documentation so that it doesn't mention string 
> lambdas, whether in prose or code. Phobos pull request #707 
> (Switch std.algorithm/.range to lambda syntax)[2] attempted 
> this and was approved and merged, but subsequently reverted due 
> to bugs.
>  * New functions would not support string lambdas.
>
> ----------
>
> To be honest, I thought this was a foregone conclusion, but 
> comments on Github indicate otherwise, hence this thread.
>
> What does everyone think?
>
>  [1] https://github.com/D-Programming-Language/phobos/pull/1453
>  [2] https://github.com/D-Programming-Language/phobos/pull/707

I could not agree more! Naturally the deprecation path should be 
done carefully, as many people already pointed out.


More information about the Digitalmars-d mailing list