Most inlining is going to cause exactly the same class of problems, which 
nearly every shipping application is going to do.  Converting these to 
helpers functions will result in a tiny little function that will be 
inlined, so, right back to the same basic problem.

Later,
Brad

On Thu, 20 May 2010, bearophile wrote:

> This page talks about default function argument values in C#4:
> http://www.lostechies.com/blogs/jimmy_bogard/archive/2010/05/18/caveats-of-c-4-0-optional-parameters.aspx
> 
> 
> Near the end it says:
> 
> >If we change the value of the optional argument from 0 to 1, we have to 
> >recompile all calling code for the calling code to get the updated value! 
> >For folks shipping assemblies for a living, this means that optional 
> >argument values don't version well, as callers have to recompile.  When I 
> >used to work for a company whose product included a DLL, we avoided optional 
> >method arguments for just this reason. It's not a reason not to use optional 
> >arguments, but it's important to understand how they work so that you don't 
> >run into headaches later.<
> 
> D too copies the default value at the calling point. Looking at this from the 
> eyes of a Python programmer this looks like a dirty hack.
> This can be a cause of problems in D dlls too, I am not sure.
> 
> 
> The related discussion on Reddit:
> http://www.reddit.com/r/programming/comments/c5st2/caveats_of_c_40_optional_parameters/
> 
> Someone has given this answer:
> 
> >Have you looked at Scala's implementation on the JVM? It's very simple. Each 
> >default parameter generates a static method with a predictable name (e.g. 
> >foo$default$3 for parameter 3 of method foo) that may be called to compute 
> >the default value of an unsupplied parameter. With this approach, changing 
> >the default value of an existing default-valued parameter means changing the 
> >implementation of a static method without changing its signature, so there 
> >is no need for callers to be recompiled. Because of JIT inlining, the 
> >performance should be the same as C#'s earlier-bound approach.<
> 
> 
> You can find more info about this Scala feature here:
> http://www.scala-lang.org/sid/1#
> 
> I copy here how it's implemented:
> 
> >
> For every parameter with a default argument, a synthetic method which 
> computes the default expression is generated. When a method application uses 
> default arguments, the missing parameters are added to the argument list as 
> calls to the corresponding synthetic methods.
> 
> def f(a: Int = 1, b: String)
> // generates a method: def f$default$1 = 1
> 
> f(b = "3")
> // transformed to: f(b = "3", a = f$default$1)
> 
> A default argument may be an arbitrary expression. Since the scope of a 
> parameter extends over all subsequent parameter lists (and the method body), 
> default expressions can depend on parameters of preceding parameter lists 
> (but not on other parameters in the same parameter list). Note that when 
> using a default value which depends on earlier parameters, the actual 
> arguments are used, not the default arguments.
> <
> 
> Bye,
> bearophile
> 

Reply via email to