code: function(value) {
          switch (values.typeOf(value)) {
              case 'Null':
              case 'Boolean':
              case 'Number':
              case 'RegExp':
                  return String(value);
  
              case 'String':
                  return JSON.stringify(value);
  
              case 'Date':
              case 'Duration':
                  return ':' + value.valueOf() + ':';
  
              case 'Filter':
                  // Filters don't have source-level representation yet, so we
                  // can't use it and we need to use a pseudo-syntax here. If
                  // filters ever become representable in source, this code should
                  // be changed to match that representation.
                  return 'filter(' + value.source + ')';
  
              case 'Array':
                  if (_.isEmpty(value)) { return '[]'; }
  
                  return '[ '
                      + _.map(value, values.inspect).join(', ')
                      + ' ]';
  
              case 'Object':
                  if (_.isEmpty(value)) { return '{}'; }
  
                  return '{ '
                      + _.map(value, function(v, k) { return k + ': ' + values.inspect(v); }).join(', ')
                      + ' }';
          }
      }
docs: Returns string representation of a Juttle value. This representation is intended to be used in places where exactness has precedence over readability (e.g. error messages, logs, dumps).  The function guarantees that the representation of each Juttle value is unique (typically the same as in Juttle source code). This means it can be used e.g. as a key in objects that map values to some associated data.  See also values.toString.