12345678910111213141516171819202122232425262728293031323334353637383940414243444546letlog_errorfmt=Printf.kprintf(funs->Format.eprintf"[Parmap]: %s@.%!"s)fmt(* tail recursive version of List.append *)letappend_trl1l2=letrecauxacc=function[]->acc|a::r->aux(a::acc)rinauxl2(List.revl1)(* tail recursive version of List.concat *)letconcat_tr(l:'alist)=List.fold_left(funaccl->append_trlacc)[](List.revl)(* tail recursive version of List.fold_right from ExtLib *)letfold_rightflinit=letfold_right_max=1000inletrectail_loopacc=function|[]->acc|h::t->tail_loop(fhacc)tinletrecloopn=function|[]->init|h::t->ifn<fold_right_maxthenfh(loop(n+1)t)elsefh(tail_loopinit(List.revt))inloop0l(* would be [? a | a <- startv--endv] using list comprehension from Batteries *)letrangestartvendv=lets,e=(minstartvendv),(maxstartvendv)inletrecauxacc=functionn->ifn=sthenn::accelseaux(n::acc)(n-1)inaux[]e(* create a shadow file descriptor *)lettempfd()=letname=Filename.temp_file"mmap""TMP"intryletfd=Unix.openfilename[Unix.O_RDWR;Unix.O_CREAT]0o600inUnix.unlinkname;fdwithe->Unix.unlinkname;raisee