1 module orelang.operator.DefmacroOperator; 2 import orelang.operator.DynamicOperator, 3 orelang.operator.IOperator, 4 orelang.Engine, 5 orelang.Value; 6 import std.algorithm, 7 std.array; 8 9 class DefmacroOperator : IOperator { 10 /** 11 * call 12 */ 13 public Value call(Engine engine, Value[] args) { 14 string macro_name = args[0].getString; 15 string[] macro_args = args[1].getArray.map!(value => value.getString).array; 16 Value _body = args[2]; 17 18 import orelang.expression.Macro; 19 auto mcr = new Macro(macro_name, macro_args, _body); 20 Value vmcr = new Value(mcr); 21 22 engine.defineVariable(macro_name, vmcr); 23 24 return vmcr; 25 } 26 }