Why assert is in the language?

Steven Schveighoffer schveiguy at yahoo.com
Thu Jun 24 06:04:48 PDT 2010


On Wed, 23 Jun 2010 16:06:48 -0400, Tomek Sowiński <just at ask.me> wrote:

> Dnia 22-06-2010 o 23:55:29 Michal Minich <michal.minich at gmail.com>  
> napisał(a):
>
>> On Tue, 22 Jun 2010 17:30:23 -0400, Steven Schveighoffer wrote:
>>
>>> On Tue, 22 Jun 2010 17:07:02 -0400, Tomek Sowiński <just at ask.me> wrote:
>>>
>>>> Yes, why? It could be implemented in object.d in a similar fashion as
>>>> std.contracts.enforce. Does it do anything special that a library
>>>> function couldn't?
>>>
>>> all calls to assert are removed by the compiler in release mode.  I
>>> don't think there's a way to implement that via a library (it would be
>>> nice though!)
>>>
>>> -Steve
>>
>> modifying 'debug' attribute which decorate a function, which new meaning
>> that all calls to it are removed in release mode, might do the trick :)
>> it also could be useful for logging.

That means you have to compile with -debug switch.  Assert is enabled  
without any switches.

>>
>> AFAIK, now the attribute means that the function does not exists in  
>> debug
>> mode, but that also means that you must mark all calls to it with  
>> 'debug'
>> which I don't find so much useful...
>
> There's a better way:
>
> void assert_(string file = __FILE__, uint line = __LINE__)(bool pred,  
> lazy string msg = null) {
>      version(unittest)
>          if (!pred)
>              throw new AssertError(msg, file, line);
> }
>
> If unittesting is off, it is inlined and all calls vanish.

Only if you specify -inline on the command line...  Not a good option.

> Someone mentioned the assert(0) special case. That could be implemented  
> like:
>
> void fail() {
>      asm {
>           // HLT instruction...
>      }
> }
>
> Following benefits spring to mind:
>   - It's clear that fail is something different than assert. Unlike  
> assert vs. assert(0).
>   - The compiler can be made aware of fail() to recognize and refuse to  
> compile dead code.
>   - Documentation can be added with no additional effort; newbies can  
> read it straight from a tooltip provided by the IDE.
>   - Curious users are free to introspect the implementation.
>
> So I ask again -- what benefits on top of that list can having assert in  
> the language give?

Well, first, you can't implement it in the library as currently designed  
without requiring special switches for normal compilation.
No need to have any more reasons.

What are the drawbacks? "keyword bloat" is an academic measure, and  
doesn't count ;)

-Steve


More information about the Digitalmars-d-learn mailing list