anchor.diff:  , gmp, openssl, readline, tzdata, libxml2, libyaml
   , boehmgc, libatomic_ops, pcre, libevent, libiconv, llvm, clang, which, zlib }:
   
  +# We need multiple binaries as a given binary isn't always able to build
  +# (even slightly) older or newer version.
  +# - 0.26.1 can build 0.25.x and 0.26.x but not 0.27.x
  +# - 0.27.2 can build 0.27.x but not 0.25.x and 0.26.x
  +#
  +# We need to keep around at least the latest version released with a stable
  +# NixOS
  +
   let
  -  binaryVersion = "0.26.0";
  -  releaseDate = "2018-08-29";
  -
  -  arch = {
  +  archs = {
       "x86_64-linux"  = "linux-x86_64";
       "i686-linux"    = "linux-i686";
       "x86_64-darwin" = "darwin-x86_64";
  -  }."${stdenv.system}" or (throw "system ${stdenv.system} not supported");
  +  };
  +
  +  arch = archs."${stdenv.system}" or (throw "system ${stdenv.system} not supported");
   
     checkInputs = [ gmp openssl readline libxml2 libyaml tzdata ];
   
  -  # we could turn this into a function instead in case we cannot use the same
  -  # binary to build multiple versions
  -  binary = stdenv.mkDerivation rec {
  -    name = "crystal-binary-${binaryVersion}";
  +  genericBinary = { version, sha256s, rel ? 1 }:
  +  stdenv.mkDerivation rec {
  +    name = "crystal-binary-${version}";
   
       src = fetchurl {
  -      url = "https://github.com/crystal-lang/crystal/releases/download/${binaryVersion}/crystal-${binaryVersion}-1-${arch}.tar.gz";
  -      sha256 = {
  -        "x86_64-linux"  = "1xban102yiiwmlklxvn3xp3q546bp8hlxxpakayajkhhnpl6yv45";
  -        "i686-linux"    = "1igspf1lrv7wpmz0pfrkbx8m1ykvnv4zhic53cav4nicppm2v0ic";
  -        "x86_64-darwin" = "0hzc65ccajr0yhmvi5vbdgbzbp1gbjy56da24ds3zwwkam1ddk0k";
  -      }."${stdenv.system}";
  +      url = "https://github.com/crystal-lang/crystal/releases/download/${version}/crystal-${version}-${toString rel}-${arch}.tar.gz";
  +      sha256 = sha256s."${stdenv.system}";
       };
   
       buildCommand = ''
  
positive.code:       inherit sha256;
      };
  
      # the first bit can go when https://github.com/crystal-lang/crystal/pull/6788 is merged
      postPatch = ''
        substituteInPlace src/compiler/crystal/config.cr \
          --replace '{{ `date "+%Y-%m-%d"`.stringify.chomp }}' '"${releaseDate}"'
        ln -s spec/compiler spec/std
        substituteInPlace spec/std/process_spec.cr \
          --replace /bin/ /run/current-system/sw/bin
      '';
  
      buildInputs = [
  
negative.code:     '';
    };
  
    generic = { version, sha256, binary, doCheck ? true }:
    stdenv.mkDerivation rec {
      inherit doCheck;
      name = "crystal-${version}";
  