module orelang.operator.DefineOperator; import orelang.operator.DynamicOperator, orelang.operator.IOperator, orelang.Engine, orelang.Value; import std.algorithm, std.array; class DefineOperator : IOperator { /** * call */ public Value call(Engine engine, Value[] args) { if (args[0].type == ValueType.SymbolValue) {// variable string varName = args[0].getString; Value var = args[1]; engine.defineVariable(varName, var); return var; } else if (args[0].type == ValueType.Array) {// function Value[] funcSignatures = args[0].getArray; string funcName = funcSignatures[0].getString; string[] funcArgs = funcSignatures[1..$].map!(value => value.getString).array; Value funcBody = args[1]; return engine.defineVariable(funcName, new Value(cast(IOperator)(new DynamicOperator(funcArgs, funcBody)))); } else { throw new Error("Invalid"); } } }