code: function(ast, options){
      options = options || {};
      if(typeof ast === 'string'){
        ast = new Parser(ast).parse()
      }
      var preExt = this.__ext__,
        record = options.record, 
        records;
  
      if(options.extra) this.__ext__ = options.extra;
  
  
      if(record) this._record();
      var group = this._walk(ast, options);
      if(record){
        records = this._release();
        var self = this;
        if( records.length ){
          // auto destroy all wather;
          group.ondestroy = function(){ self.$unwatch(records); }
        }
      }
      if(options.extra) this.__ext__ = preExt;
      return group;
    }
docs: compile a block ast ; return a group;
  @param  {Array} parsed ast
  @param  {[type]} record
  @return {[type]}