The Thermopylae excerpt of TDPL available online

Lars T. Kyllingstad public at kyllingen.NOSPAMnet
Fri Oct 30 05:14:08 PDT 2009


Don wrote:
> Lars T. Kyllingstad wrote:
>> Don wrote:
>>> Lars T. Kyllingstad wrote:
>>>> Denis Koroskin wrote:
>>>>> On Thu, 29 Oct 2009 15:12:51 +0300, Lars T. Kyllingstad 
>>>>> <public at kyllingen.nospamnet> wrote:
>>>>>
>>>>>> Jason House wrote:
>>>>>>> Andrei Alexandrescu Wrote:
>>>>>>>
>>>>>>>> It's a rough rough draft, but one for the full chapter on 
>>>>>>>> arrays, associative arrays, and strings.
>>>>>>>>
>>>>>>>> http://erdani.com/d/thermopylae.pdf
>>>>>>>>
>>>>>>>> Any feedback is welcome. Thanks!
>>>>>>>  I still think is expressions are a glaring problem. Somewhere in 
>>>>>>> the text, you use assert(!is(typeof(... as support for what 
>>>>>>> you're talking about. That particular construct feels more like a 
>>>>>>> hack someone stumbled into than clean, easy to read code. It's 
>>>>>>> the type of thing a programmer will get wring unless they use it 
>>>>>>> frequently. Even you've screwed it up in past Phobos releases!  
>>>>>>> IMHO all is(...) expressions should be revisited. Have you 
>>>>>>> written the section(s) on them yet?
>>>>>>
>>>>>> I don't think he uses is(typeof(...)) in the text. The code 
>>>>>> snippets in question are marked "Note: normally the code below 
>>>>>> would not be included...", and I suppose he's put them there as a 
>>>>>> reminder for himself and Walter on what needs to be fixed before 
>>>>>> the book comes out.
>>>>>>
>>>>>> I agree with you, though, is(typeof(...)) is quite often misused, 
>>>>>> or at least used in an ugly way. Why not use __traits(compiles, 
>>>>>> ...) instead?
>>>>>>
>>>>>> -Lars
>>>>>
>>>>> ... which is at least as ugly.
>>>>
>>>>
>>>> I disagree. Pretend you are just learning D, and you are presented 
>>>> with the following two lines of code:
>>>>
>>>>   static assert (is(typeof(XXX));
>>>>   static assert (__traits(compiles, XXX));
>>>>
>>>> Which of these would you most likely assume to be a check on whether 
>>>> XXX is compilable code?
>>>>
>>>> What I cannot for the life of me understand is WHY the double 
>>>> underscores? What's wrong with just "traits"?
>>>>
>>>> -Lars
>>>
>>> Also is(typeof(XXX)) *doesn't* currently check that XXX is 
>>> compilable, just that it has a type.
>>> OTOH __traits(compiles, XXX) is ugly. traits(compiles, XXX) would be 
>>> better; but I think we need to do better than that. It's the 
>>> bread-and-butter of metaprogramming in D. Using the ugly syntax, it 
>>> has well and truly proved its value.
>>> I've counted 20 uses in what I've seen of Andrei's book -- it appears 
>>> about as often as (say) 'delegate'!
>>>
>>> It does a beautiful thing, it deserves a beautiful syntax. Something 
>>> at least as good as __compiles(XXX), I reckon.
>>
>> Again with the double underscores. :)
> Yes. That's why I said "at least as good".
> 
>  I'm starting to think we need a
>> separate namespace for the CT stuff.
>>
>>   D.compiles(XXX)
>>   D.typeof(foo)
>>   D.stringof(T)
>>   D.allMembers(T)
> 
> That's not bad. Can't be 'D', though, has to look like a keyword. Maybe 
> something like 'traits' instead. In exchange, get rid of the '__traits' 
> and 'typeid' keywords. Not sure about typeof, though.
> 
> traits.compiles(XXX)
> traits.typeid(TTT)
> traits.stringof(T)
> traits.allMembers(T)
> traits.error("message");
> 
> IMHO this looks better than __traits(compiles, XXX) but it actually has 
> the same flexibility, and it's a straightforward transformation inside 
> the compiler.
> For bonus points, allow 'with(traits)':
> 
> with(traits) {
>   if (compiles(XXX)) return stringof(T);
>   else error("Can't use " ~ stringof(T) ~ " in a transmogrifier.");
> }

I like it. It's a clean, simple solution. The std.traits module will 
just have to be renamed to std.meta or something. Or one could possibly 
use 'meta' as the new keyword:

   meta.compiles(XXX)
   meta.typeid(T)
   meta.stringof(T)

Actually, I think I like that better than 'traits'.

-Lars



More information about the Digitalmars-d mailing list