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(className, cEngine); 25 Value cls = new Value(clst); 26 engine.defineVariable(className, cls); 27 28 return cls; 29 } 30 } 31 32 33 class NewOperator : IOperator { 34 public Value call(Engine engine, Value[] args) { 35 string className; 36 if (args[0].type == ValueType.SymbolValue) { 37 className = args[0].getString; 38 } else { 39 className = engine.eval(args[0]).getString; 40 } 41 42 ClassType _cls = engine.getVariable(className).getClassType; 43 ClassType cls = new ClassType(_cls.className, _cls._engine.clone); 44 45 Value[] cArgs; 46 47 if (args.length > 0) { 48 foreach (arg; args[1..$]) { 49 cArgs ~= engine.eval(arg); 50 } 51 } 52 53 cls._engine.variables["constructor"].getIOperator.call(cls._engine, cArgs); 54 55 return new Value(cls); 56 } 57 }