module orelang.operator.DefmacroOperator; import orelang.operator.DynamicOperator, orelang.operator.IOperator, orelang.Engine, orelang.Value; import std.algorithm, std.array; class DefmacroOperator : IOperator { /** * call */ public Value call(Engine engine, Value[] args) { string macro_name = args[0].getString; string[] macro_args = args[1].getArray.map!(value => value.getString).array; Value _body = args[2]; import orelang.expression.Macro; auto mcr = new Macro(macro_name, macro_args, _body); Value vmcr = new Value(mcr); engine.defineVariable(macro_name, vmcr); return vmcr; } }