Skip to content

Instantly share code, notes, and snippets.

@alphaKAI
Created November 21, 2019 13:28
Show Gist options
  • Save alphaKAI/1d6a3f34374b0000d9e7b0664896d383 to your computer and use it in GitHub Desktop.
Save alphaKAI/1d6a3f34374b0000d9e7b0664896d383 to your computer and use it in GitHub Desktop.
Meta Dlang
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