anchor.diff:      then []
       else map (p: substring p 1 s) (lib.range 0 (sub l 1));
   
  -    
  +
     # Manipulate a string charcater by character and replace them by strings
     # before concatenating the results.
     stringAsChars = f: s:
  
positive.code:       map f (stringToCharacters s)
      );
  
      
    # same as vim escape function.
    # Each character contained in list is prefixed by "\"
    escape = list : string :
      stringAsChars (c: if lib.elem c list then "\\${c}" else c) string;
  
      
    # still ugly slow. But more correct now
    # [] for zsh
    escapeShellArg = lib.escape (stringToCharacters "\\ ';$`()|<>\t*[]");
  
    
    # replace characters by their substitutes.  This function is equivalent to
    # the `tr' command except that one character can be replace by multiple
    # ones.  e.g.,
  
negative.code: 
    # Idem for Perl search paths.
    makePerlPath = makeSearchPath "lib/perl5/site_perl";
  
  
    # Dependening on the boolean `cond', return either the given string
    # or the empty string.
    optionalString = cond: string: if cond then string else "";
  
  
    # Determine whether a filename ends in the given suffix.
    hasSuffix = ext: fileName:
      let lenFileName = stringLength fileName;
  