1 module orelang.operator.ClassOperators; 2 import orelang.operator.DynamicOperator, 3 orelang.expression.ClassType, 4 orelang.operator.IOperator, 5 orelang.Closure, 6 orelang.Engine, 7 orelang.Value; 8 9 class ClassOperator : IOperator { 10 public Value call(Engine engine, Value[] args) { 11 string className = engine.eval(args[0]).getString; 12 Engine cEngine = engine.clone; 13 14 if (args.length > 1) { 15 foreach (member; args[1..$]) { 16 cEngine.eval(member); 17 } 18 } 19 20 if ("constructor" !in cEngine.variables.called) { 21 cEngine.defineVariable("constructor", new Value(cast(IOperator)(new DynamicOperator((string[]).init, new Value)))); 22 } 23 24 ClassType clst = new ClassType(cEngine); 25 Value cls = new Value(clst); 26 27 engine.defineVariable(className, cls); 28 29 return cls; 30 } 31 } 32 33 34 class NewOperator : IOperator { 35 public Value call(Engine engine, Value[] args) { 36 string className; 37 38 if (args[0].type == ValueType.SymbolValue) { 39 className = args[0].getString; 40 } else { 41 className = engine.eval(args[0]).getString; 42 } 43 44 ClassType _cls = engine.getVariable(className).getClassType; 45 ClassType cls = new ClassType(_cls._engine.clone); 46 47 Value[] cArgs; 48 49 if (args.length > 0) { 50 foreach (arg; args[1..$]) { 51 cArgs ~= engine.eval(arg); 52 } 53 } 54 55 cls._engine.variables["constructor"].getIOperator.call(cls._engine, cArgs); 56 57 return new Value(cls); 58 } 59 }