#+begin_src elisp tangle: no :results none :exports none (setq pwd (file-name-directory buffer-file-name)) (setq name (file-name-nondirectory (substring buffer-file-name 0 -4))) (setq lib (concat pwd "lib/")) (setq testdir (concat pwd "test/")) (setq mli (concat lib name ".mli")) (setq ml (concat lib name ".ml")) (setq test-ml (concat testdir name ".ml")) (org-babel-tangle) #+end_src * Spin :PROPERTIES: :header-args: :noweb yes :comments both :END: Electron spin ** Type #+begin_src ocaml :tangle (eval mli) type t = Alfa | Beta #+end_src Note : ~Alfa~ if written with an 'f' instead of 'ph' because it has the same number of letters as ~Beta~, so the alignment of the code is nicer. #+begin_src ocaml :tangle (eval ml) :exports none type t = (* m_s *) | Alfa (* {% $m_s = +1/2$ %} *) | Beta (* {% $m_s = -1/2$ %} *) #+end_src ** Functions #+begin_src ocaml :tangle (eval mli) val other : t -> t #+end_src Returns the opposite spin #+begin_src ocaml :tangle (eval ml) :exports none let other = function | Alfa -> Beta | Beta -> Alfa let to_string = function | Alfa -> "Alpha" | Beta -> "Beta " #+end_src ** Printers #+begin_src ocaml :tangle (eval mli) val pp : Format.formatter -> t -> unit #+end_src #+begin_src ocaml :tangle (eval ml) :exports none let pp ppf t = Format.fprintf ppf "@[%s@]" (to_string t) #+end_src