public VoidValue visitDefine(DefineComponent c) {
      Define define = lookupDefine(c.getName());
      if (overrides != null)
        overrides.add(new Override(define, c.getName()));
      if (define.status != DEFINE_KEEP) {
        ignoredDefines.add(c);
        define.status = DEFINE_IGNORE;
        return VoidValue.VOID;
      }
      if (c.getCombine() == null) {
        if (define.hadImplicit) {
          er.error("multiple_define", c.getName(), c.getSourceLocation());
          return VoidValue.VOID;
        }
        define.hadImplicit = true;
      }
      else if (define.combine == null) {
        define.combine = c.getCombine();
        if (define.combine == Combine.CHOICE)
          define.wrapper = new ChoicePattern();
        else
          define.wrapper = new InterleavePattern();
        define.wrapper.setSourceLocation(c.getSourceLocation());
      }
      else if (define.combine != c.getCombine()) {
        er.error("inconsistent_combine", c.getName(), c.getSourceLocation());
        return VoidValue.VOID;
      }
      if (define.pattern == null) {
        define.pattern = c.getBody();
        define.head = c;
      }
      else {
        if (define.pattern != define.wrapper)
          define.wrapper.getChildren().add(define.pattern);
        define.wrapper.getChildren().add(c.getBody());
        define.pattern = define.wrapper;
      }
      return VoidValue.VOID;
    }