It’s been a couple of months since the last neocamlrelease, and the reason is simple — for a while there I was genuinely out of ideas.Back when I shipped 0.6I declared (again!) that I was done with new features, and this time I almost meantit. But ideas have a way of creeping back in, and 0.9 turned out to be a meatyrelease. Here are the highlights.A much nicer REPL experienceThe biggest chunk of work went into the REPL (toplevel) integration. I’m well awarethat the OCaml toplevel isn’t terribly popular with seasoned OCaml developers — mostof them reach for a proper build and a debugger instead. But I think newcomers get alot of mileage out of a REPL, and (no surprise to anyone who’s followed my work) I’ma Lisper at heart with a real soft spot for interactive development. Clojure andEmacs Lisp spoiled me, and I want OCaml beginners to taste a bit of that too.So, what’s new: A dedicated REPL per project. The REPL buffer is now named after its project(e.g. *OCaml: myproject*), and the send commands route to the current buffer’sproject REPL. You can have several projects running side by side without themstepping on each other. Choose your toplevel. The new neocaml-repl-flavor lets you pick betweenocaml, utop, and dune-utop. Set it globally, or per project via.dir-locals.el: 1((neocaml-mode . ((neocaml-repl-flavor . dune-utop)))) The active flavor shows up in the REPL’s mode line, so you always know what you’retalking to. Send a phrase and step. C-c C-n (neocaml-repl-send-phrase-and-step) sendsthe phrase at point to the REPL and moves on to the next one — perfect for walkingthrough a file top to bottom while you experiment. #require from Emacs. neocaml-repl-require loads a findlib package into therunning toplevel without you having to type the directive by hand. Restart on demand. neocaml-repl-restart kills and restarts the toplevel whenthings get into a weird state.Completion for Opam and Dune, no LSP requiredThis one I’m particularly happy with. .ml/.mli files have ocaml-lsp-server tolean on for completion, but the auxiliary file formats have no language server at all.That’s exactly the kind of gap neocaml is meant to fill, so both neocaml-dune-modeand neocaml-opam-mode now ship a completion-at-point backend.In a dune file you get completion for stanza names, the field names valid for theenclosing stanza, and library names inside libraries/pps fields:(library (name my_lib) (libraries str re|)) ; = "3.0"} "cmd|" ;