D library projects
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Sun Nov 15 08:49:18 PST 2009
Michel Fortin wrote:
> On 2009-11-15 00:09:43 -0500, "Steven Schveighoffer"
> <schveiguy at yahoo.com> said:
>
>> I agree -- it should be possible with the metaprogramming power of
>> D to allow for the user to choose his weapon -- power and speed
>> vs. safe. I think simplicity is a given.
>>
>> For example, it could be a version statement that decides whether
>> ranges of a container do runtime checks for safety.
>
> Interesting, although you'll probably want better granularity than a
> version statement. If your containers are going to be used with
> SafeD perhaps you'll want a safe and an unsafe variant of some
> accessor functions (one with bound checks being called for safe code,
> the other without).
Here's the current proposal as distilled from the recent newsgroup
comments. I think Michal Minich made a very good point here:
===============================
> I think there are two cases:
>
> User would want max performance from a some library, but he does not
> care about performance. User should have the right to override
> intentions of library writer, making his code less safe, to achieve
> speed. Compiler flag -unsafe (or -unsafe-no-bounds-checking) should
> do this. The user will know that he is *overriding* the original
> safety to lower level.
>
> Also, when a library writer wants his code to appeal and be usable to
> most users, he should mark it @safe or @trusted. But in situation,
> when he knows that safe code would be always bounds-checked (there is
> no -unsafe compiler switch), he may rather mark his code @trusted,
> even if it would be safe, in order to appeal to user that don't want
> slow (bounds-checked) library. If the library writer knows that users
> can override safety (bounds-checking), he would not hesitate to use
> @safe where appropriate.
>
> the -unsafe-no-bounds-checking flag is essential for properly working
> of safeness in D.
===============================
There were arguments to the same effect, but the above brings an
original insight into the psychological and social aspects of the matter.
So I think a good solution is:
a) Have -release KEEP bounds checking for @safe functions, and REMOVE
them for the others. We may consider that bounds checking in non- at safe
functions are done with assert().
b) Define a new flag -no-bounds-checking that allows bounds checking
removal even for @safe functions.
>> I think shoehorning containers that are graph based into value
>> types might be a little strenuous. All the builtin D container
>> types are essentially reference types (arrays are not exactly
>> reference types but behave mostly like reference types), I don't
>> see why we should change that.
>>
>> Making them classes allows for interfaces which helps allow runtime
>> decisions for things like copying data between containers that are
>> of different types. See dcollections and how easy it is to copy
>> data from one type to another.
>
> I'm of the same opinion.
I couldn't find the details on copying. How does dcollections solve it?
It's a double dispatch issue.
> That said, I'm wondering if the container
> classes shouldn't also be made final (unlike dcollections). Being
> classes would make them easy to pass as interfaces, but them being
> final would help skip the virtual calls whenever you don't pass them
> as interfaces.
Sounds nice.
Andrei
More information about the Digitalmars-d
mailing list