code: function sphere(cx, cy, cz, r){
      var sqrt = Math.sqrt;
      var round = Math.round;
      return function(cons, nil){
        for (var y = -r; y < r; ++y){
          var xl = round(sqrt(r*r - y*y));
          for (var x = -xl; x < xl; ++x){
            if (x*x + y*y < r*r){
              var z = round(sqrt(r*r - x*x - y*y));
              nil = cons(cx+x, cy+y, cz-z, nil);
              nil = cons(cx+x, cy+y, cz+z, nil);
            };
          };
        };
        return nil;
      };
    }
docs: type AtomsCList = ∀ a . (#Vector3, #Vector3, a -> a), a -> a Vector3 values are expanded (splat) on the callback function call Example: box(8,8,8)(function(x,y,z,nx,ny,nz,init){ ... }, init); Number, Number, Number, Number -> AtomsCList