Playing arround with mixin - alias?
ketmar via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Apr 21 05:53:08 PDT 2017
Martin Tschierschke wrote:
>> i doubt so.
> So my "solution" on how to get a short cut for using:
>
> writeln(mixin(interp!"${name} you are app. ${age*365} days old"));
..
NEVER. EVER. USE. THE. FOLOWING. IN. YOUR. CODE.
NEVER!!!
import std.stdio;
mixin template usesexpand() {
import std.format : format;
string sexpand1(string s) () {
char[] res;
res.length = s.length+1024;
auto rused = res.length;
auto rpos = rused*0; // i really HAET `size_t`!
void put(bool escape=true) (const(char)[] s...) {
foreach (char ch; s) {
static if (escape) {
if (ch == '"' || ch == '\\') {
if (rpos == rused) { rused += 1024; res.length = rused; }
res[rpos++] = '\\';
}
}
if (rpos == rused) { rused += 1024; res.length = rused; }
res[rpos++] = ch;
}
}
char[] fmt;
fmt.length = 256;
auto fused = fmt.length;
auto fpos = fused*0; // i really HAET `size_t`!
void putfmt (const(char)[] s...) {
foreach (char ch; s) {
if (fpos == fused) { fused += 1024; fmt.length = fused; }
fmt[fpos++] = ch;
}
}
putfmt(`format("`);
auto pos = rpos, epos = rpos;
pos = 0;
while (pos < s.length) {
epos = pos;
while (epos < s.length && s[epos] != '$') ++epos;
putfmt("%s");
put!false(`, "`);
if (epos+1 >= s.length || s[epos+1] != '{') {
put(s[pos..epos+1]);
put!false(`"`);
pos = epos+1;
continue;
}
put(s[pos..epos]);
put!false(`"`);
pos = epos+2;
while (epos < s.length && s[epos] != '}') ++epos;
if (epos > pos) {
putfmt("%s");
put(`, `);
put(s[pos..epos]);
}
pos = epos+1;
}
put(`)`);
putfmt(`"`);
return cast(string)fmt[0..fpos]~cast(string)res[0..rpos]; // it is safe to cast here
}
enum sexpandstr(string s) = sexpand1!s;
enum sexpand(string s) = mixin(sexpand1!s);
void echo(string s) () { writeln(mixin(sexpand1!s)); }
}
mixin usesexpand;
immutable n = 40;
enum nstr = sexpand!"n is ${n+2}";
void main () {
mixin usesexpand;
int a = 42/2;
echo!"a is ${a*2}"; //writeln(mixin(sexpandstr!"a is ${a*2}"));
writeln(nstr);
}
More information about the Digitalmars-d-learn
mailing list