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.