Created
November 21, 2019 13:28
-
-
Save alphaKAI/1d6a3f34374b0000d9e7b0664896d383 to your computer and use it in GitHub Desktop.
Meta Dlang
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import std.stdio, std.format; | |
interface MetaDlangObject { | |
const enum string eval(); | |
} | |
interface MetaDlangExpr : MetaDlangObject { | |
} | |
interface MetaDlangStatement : MetaDlangObject { | |
} | |
class MetaDlangVariable : MetaDlangExpr { | |
const string var_name; | |
this(const string var_name) { | |
this.var_name = var_name; | |
} | |
const enum string eval() { | |
return this.var_name; | |
} | |
} | |
abstract class MetaDlangBinaryExpr(string op) : MetaDlangExpr { | |
const MetaDlangExpr lhs, rhs; | |
this(const MetaDlangExpr lhs, const MetaDlangExpr rhs) { | |
this.lhs = lhs; | |
this.rhs = rhs; | |
} | |
const enum string eval() { | |
return "%s %s %s".format(this.lhs.eval(), op, this.rhs.eval()); | |
} | |
} | |
class MetaDlangAdd : MetaDlangBinaryExpr!"+" { | |
this(const MetaDlangExpr lhs, const MetaDlangExpr rhs) { | |
super(lhs, rhs); | |
} | |
} | |
class MetaDlangAssignExpr : MetaDlangBinaryExpr!"=" { | |
this(const MetaDlangExpr lhs, const MetaDlangExpr rhs) { | |
super(lhs, rhs); | |
} | |
} | |
class MetaDlangExprToStatement : MetaDlangStatement { | |
const MetaDlangExpr expr; | |
this(const MetaDlangExpr expr) { | |
this.expr = expr; | |
} | |
const enum string eval() { | |
return "%s;".format(this.expr.eval()); | |
} | |
} | |
void main() { | |
int a = 1, b = 2, c; | |
static const MetaDlangExpr var_a = new MetaDlangVariable("a"); | |
static const MetaDlangExpr var_b = new MetaDlangVariable("b"); | |
static const MetaDlangExpr var_c = new MetaDlangVariable("c"); | |
static const MetaDlangExpr add_expr = new MetaDlangAdd(var_a, var_b); | |
static const MetaDlangExpr assign_expr_to_c = new MetaDlangAssignExpr(var_c, add_expr); | |
static const MetaDlangStatement assign_statement = new MetaDlangExprToStatement(assign_expr_to_c); | |
mixin(assign_statement.eval); | |
writeln("a: ", a); | |
writeln("b: ", b); | |
writeln("c: ", c); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment