ch-ch-changes
Don
nospam at nospam.com
Wed Jan 28 05:06:33 PST 2009
grauzone wrote:
> One thing about std.algorithm: you really seem to like using
> compile-time strings as literals. However, this makes the use of
> delegates harder. For example, to use a delegate, you need to do this
> (quoted from your docs):
>
> > int[] a = ...;
> > static bool greater(int a, int b)
> > {
> > return a > b;
> > }
> > sort!(greater)(a); // predicate as alias
>
> In my opinion, doing something like
>
> > sort(a, (int a, int b) { return a > b; });
>
> would be simpler and more intuitive than passing a delegate name as
> template parameter. (The delegate literal syntax still could be
> improved, though.)
>
> Does std.algorithm work with closures at all? I see that the greater()
> function in your example is marked as static. (Sorry, I didn't test it
> myself.)
>
> Using string mixins messes up syntax highlighting
I think the argument that a language should be designed around the
limitations of an IDE designed for a different language is a weak one.
Especially with the greatly improved support for string mixins which
just got added in the last version of Descent.
> and the code is more
> obfuscated. If you make an error in your predicate, random funny things
> internal to the library implementation could happen, and the compiler
> will spurt out indecipherable error messages for random modules (I guess
> in this case, std.algorithm or std.functional).
Not necessarily. Andrei can just add:
static if(__traits(compiles, mixin(comp) )) {
mixin(comp);
} else {
// static assert is a bit broken,
// better to do it this way to provide a backtrace.
pragma(msg, "Bad predicate: " ~ comp);
deliberate_error_message; // t
}
into std.functional. Which will generate a very controlled error message.
(Doesn't work if the predicate contains mismatched parentheses, but
that's fixable).
The language changes required to give a perfect solution to this are
pretty small (just get static assert() to give the instantiation point
of each template which instantiated it, create a version of traits which
, given a string, tells you if it would compile if it were mixed in).
Then we get:
static assert(__traits(mixincompiles, comp), "Predicate: " ~ comp ~ "
does not compile");
mxin(comp);
How will runtime
> debugging work? Will the debugger be smart enough to point me to the
> correct source code location, if there happens a segfault in my
> predicate? I'm sure it could, if you used delegates instead.
>
> Why did you make this so complex? What's your position on this? Do you
> agree that there are problems, or are you happy with how it is?
>
> Why did you choose to do it like this? Because it is shorter, or for
> performance (avoid delegate call)?
It's a LOT faster than delegates.
Does it enable some weird use cases,
> which wouldn't be possible when using delegates?
>
> Regarding performance: I don't think performance justifies all these
> problems. Standard library functions should be as fast as possible, but
> this goal should come second after robustness and simplicity.
>
> Another problem is, that using string mixins seems to be quite
> problematic, because they are mixed in in a different scope. If I'm not
> mistaken, you can't do this:
>
> > int foo(...) {...}
> > sort!("foo(a, b);");
>
> You might think that "sort!("a>b", a);" is elegant and short, but this
> probably only works out in toy-examples.
String mixins are only intended to be used in simple cases. If it's not
simple, you can use a delegate, because the overhead becomes a small
part of the cost.
>
> And macros, which are supposed to magically cure all those problems,
> were postponed to D3.0.
>
> I'm also worried about compile times. You use nested templates with
> string mixins, which only can be slower to compile than using e.g. the
> builtin .sort. I don't know if this a problem, but in my opinion,
> compile times are already high enough. Times will add up!
The CTFE bug still needs to be fixed.
>
> For one, I'm sure that this will generate an additional gazillion of
> nearly useless linker symbols with very long names.
No. That happens with templates, not CTFE. Excluding the CTFE bug, of
course.
More information about the Digitalmars-d
mailing list