code: func (vars variables) set(name, value string) error {
  	v := vars[name]
  	if v == nil {
  		return fmt.Errorf("no variable %s", name)
  	}
  	var err error
  	switch v.kind {
  	case boolKind:
  		var b bool
  		if b, err = stringToBool(value); err == nil {
  			if v.group != "" && !b {
  				err = fmt.Errorf("%q can only be set to true", name)
  			}
  		}
  	case intKind:
  		_, err = strconv.Atoi(value)
  	case floatKind:
  		_, err = strconv.ParseFloat(value, 64)
  	case stringKind:
  		// Remove quotes, particularly useful for empty values.
  		if len(value) > 1 && strings.HasPrefix(value, `"`) && strings.HasSuffix(value, `"`) {
  			value = value[1 : len(value)-1]
  		}
  	}
  	if err != nil {
  		return err
  	}
  	vars[name].value = value
  	if group := vars[name].group; group != "" {
  		for vname, vvar := range vars {
  			if vvar.group == group && vname != name {
  				vvar.value = "f"
  			}
  		}
  	}
  	return err
  }
docs: // set updates the value of a variable, checking that the value is
  // suitable for the variable Kind.