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 }