tools.ctfe for D1
Ellery Newcomer
ellery-newcomer at utulsa.edu
Thu Apr 22 18:09:47 PDT 2010
well, here you are:
http://www.dsource.org/projects/dexcelapi/browser/trunk/src/dxl/util/ctfe.d
and here is where I use it:
http://www.dsource.org/projects/dexcelapi/browser/trunk/src/dxl/biff/Enums.d
I don't think it's worth the effort of changing that stuff to work with
your table parsing, but if you make your tables work with '\u2500' and
friends, I might do it..
On 04/22/2010 12:36 PM, FeepingCreature wrote:
> On 21.04.2010 16:43, Ellery Newcomer wrote:
>> On 04/21/2010 05:43 AM, FeepingCreature wrote:
>>> On 20.04.2010 01:49, Ellery Newcomer wrote:
>>>> Are there any good libraries for ctfe/code generation?
>>>>
>>>> I don't know, things like parsing support for compile time strings,
>>>> string formatting, type<-> string
>>>>
>>>> My project seems to be growing ctfe, and it's all horribly hacky and
>>>> ugly code.
>>>
>>> This might be useful if you're on D1:
>>> http://dsource.org/projects/scrapple/browser/trunk/tools/tools/ctfe.d
>>>
>>
>> Looks like itś exactly what I want, thanks!
>>
>> A couple notes:
>>
>> Is there any particular license associated with it? (whatever tangoś is
>> would be fine)
>>
>
> Feel free to use it as you wish.
>
>> When I try to compile, I get forward referencing errors and had to take
>> out the import to tools.compat
>>
>
> Yeah, nevermind that, it just defines string as char[] .. or used to, I think that's in tools.text nowadays. tools.ctfe is pretty independent from the rest of tools.
>
>> Also, are there any examples for usage of the table parsing functions?
>
> Here's one from my IF language, for converting dynamic into native types:
>
> union {
> bool b;
> int i;
> string s;
> float f;
> Scope sr;
> }
> T to(T)() {
> const string Table = `
> | bool | int | string | float | Scope
> -----------+---------------+-------------+----------------------+---------+----------
> Boolean | b | b | b?q{true}p:q{false}p | ø | ø
> Integer | i != 0 | i | Format(i) | i | ø
> String | s == q{true}p | atoi(s) | s | atof(s) | ø
> Float | ø | cast(int) f | Format(f) | f | ø
> ScopeRef | !!sr | ø | (sr?sr.fqn:q{(null:r)}p) | ø | sr
> ScopeValue | sr.value().to!(T) | sr.value().to!(T) | sr.value().to!(T) | sr.value().to!(T) | sr`;
> mixin(ctTableUnrollColMajor(Table,
> /* First parameter is the outer template, $COL substituting with the column name, and $BODY substituting with the inner template*/
> `static if (is(T == $COL))
> switch (flatType) {
> $BODY
> default: throw new Exception(Format("Invalid type: ", flatType));
> }
> else `,
> /* Second parameter is the inner template, $ROW substituting with the row name and $CELL with the cell's content.
> `case FlatType.$ROW:
> static if (q{$CELL}p == "ø")
> throw new Exception(q{Cannot convert $ROW to $COL: }p~to!(string)~q{! }p);
> else return $CELL;
> `
> ).litstring_expand() /* expand q{}p into ""s with correct nesting */ ~ `static assert(false, "Unsupported type: "~T.stringof); `);
> }
>
>
>> And to whom do I give attribution?
>
> Attribution is not necessary. I'm glad someone finds it useful.
More information about the Digitalmars-d-learn
mailing list