diff --git a/ha-programming-ocaml.org b/ha-programming-ocaml.org new file mode 100644 index 0000000..821ef88 --- /dev/null +++ b/ha-programming-ocaml.org @@ -0,0 +1,108 @@ +#+TITLE: Emacs OCaml Integration +#+AUTHOR: Howard X. Abrams +#+DATE: 2022-08-24 +#+FILETAGS: :emacs: + +A literate programming file for integrating the [[https://ocaml.org/][OCaml programming language]]. +#+begin_src emacs-lisp :exports none + ;;; ha-programming-ocaml --- integrating OCaml -*- lexical-binding: t; -*- + ;; + ;; © 2022 Howard X. Abrams + ;; Licensed under a Creative Commons Attribution 4.0 International License. + ;; See http://creativecommons.org/licenses/by/4.0/ + ;; + ;; Author: Howard X. Abrams + ;; Maintainer: Howard X. Abrams + ;; Created: August 24, 2022 + ;; + ;; While obvious, GNU Emacs does not include this file or project. + ;; + ;; *NB:* Do not edit this file. Instead, edit the original literate file at: + ;; ~/other/hamacs/ha-programming-ocaml.org + ;; And tangle the file to recreate this one. + ;; + ;;; Code: + #+end_src + +* Introduction +After reading [[ https://batsov.com/articles/2022/08/19/learning-ocaml/][Batsov's OCaml overview essay]], I became intrigued with learning more about it. Like him, I’ll probably start learning OCaml using the following resources: + * [[https://ocaml.org/docs/up-and-running][Getting Started]]: At the primary ocaml website. + * [[https://dev.realworldocaml.org/][Real World OCaml]]: A free book about OCaml, that's considered one of the best starting points in the community. + * [[https://cs3110.github.io/textbook/cover.html][Cornell University's course on OCaml]]: It's taught at the university, but the textbook and the video lectures are freely available online. + * [[https://ocamlverse.github.io/][OCamlverse]]: An OCaml community wiki. + +As these [[http://dev.realworldocaml.org/install.html][installation instructions state]], the primary binary to install is the /package manager/, like: +#+begin_src sh + brew install opam +#+end_src + +Initialize the opam package database by running: +#+begin_src sh + opam init +#+end_src + +The book suggests installing utop: +#+begin_src sh + opam install core core_bench utop +#+end_src + +The book also mentions that opam comes with a user-setup package to install Emacs configs. You can install it as follows, along with some related packages: +#+begin_src sh + opam install user-setup tuareg ocamlformat merlin + opam user-setup install +#+end_src +But I won’t be doing that, as I can configure it. +* Basics +I kicked off this code by following with [[https://batsov.com/articles/2022/08/23/setting-up-emacs-for-ocaml-development/][these instructions]] from Batsov. + +Use the [[https://github.com/ocaml/tuareg][tuareg package]] for OCaml programming: +#+begin_src emacs-lisp + (use-package tuareg + :mode (((rx ".ocamlinit" eos) . tuareg-mode))) +#+end_src + +Use [[https://github.com/ocaml/dune/blob/main/editor-integration/emacs/dune.el][dune.el]] to edit Dune project files: +#+begin_src emacs-lisp + (use-package dune) +#+end_src + +[[https://github.com/ocaml/merlin][Merlin]] provides advanced IDE features: +#+begin_src emacs-lisp + (use-package merlin + :config + (add-hook 'tuareg-mode-hook #'merlin-mode) + (add-hook 'merlin-mode-hook #'company-mode) + ;; we're using flycheck instead + (setq merlin-error-after-save nil)) + + (use-package merlin-eldoc + :hook ((tuareg-mode) . merlin-eldoc-setup)) +#+end_src + +The flycheck package uses Merlin internally: +#+begin_src emacs-lisp + (use-package flycheck-ocaml + :config (flycheck-ocaml-setup)) +#+end_src + +If I get into [[https://opam.ocaml.org/blog/about-utop/][utop]], I can also setup some integration with it like this: +#+begin_src emacs-lisp + (use-package utop + :config + (add-hook 'tuareg-mode-hook #'utop-minor-mode)) +#+end_src +* Technical Artifacts :noexport: +Let's =provide= a name so we can =require= this file: +#+begin_src emacs-lisp :exports none + (provide 'ha-programming-ocaml) + ;;; ha-programming-ocaml.el ends here + #+end_src + +#+DESCRIPTION: integrating OCaml +#+PROPERTY: header-args:sh :tangle no +#+PROPERTY: header-args:emacs-lisp :tangle yes +#+PROPERTY: header-args :results none :eval no-export :comments no mkdirp yes + +#+OPTIONS: num:nil toc:nil todo:nil tasks:nil tags:nil date:nil +#+OPTIONS: skip:nil author:nil email:nil creator:nil timestamp:nil +#+INFOJS_OPT: view:nil toc:nil ltoc:t mouse:underline buttons:0 path:http://orgmode.org/org-info.js