Notes from Real World OCaml, chapters 4 and 5
This post is part 3 of the “Real World OCaml” series:
- Notes from Real World OCaml, first edition
- Notes from Real World OCaml, chapter 3
- Notes from Real World OCaml, chapters 4 and 5
- Notes from Real World OCaml, chapter 7, part 1
- Notes from Real World OCaml, chapter 7, part 2
Chapter 4
Chapter 4 mostly works, but you need to replace open Core.Std
with open Core
, and include open Base.Poly
after open Core
in session_info.ml
. This latter change restores the polymorphic equality operators. My updated code from it at the end of the chapter is here.
Chapter 5
Instead of using Core_extended
, which appears to be a mere shadow of itself, you should install the shell
package. This appears to be the Shell
module from Core_extended
broken out to its own package. Thus, in utop
, instead of:
utop # #require "core_extended";;
utop # open Core_extended.Std;;
Run this instead:
utop # #require "shell";;
utop # open Core;;
For the example, here’s the code:
type host_info = {
hostname : string;
os_name : string;
cpu_arch : string;
timestamp : Core.Time.t;
}
let my_host =
let sh = Shell.sh_first_line_exn in {
hostname = sh "hostname";
os_name = sh "uname -s";
cpu_arch = sh "uname -p";
timestamp = Core.Time.now ();
}
Notice how I’ve substituted sh_first_line_exn
for sh_one_exn
? The latter is deprecated, but the former has the same behaviour but is not deprecated.
For host_info_to_string
, you’ll need to do open Printf
to include sprintf
in the REPL’s namespace.
For the get_users
function, it tells you to add with fields
at the end of the Login module
. This no longer works. Instead, you need the ppx_jane
package, which appears to have superceded fieldslib
for this purpose, and rather than the with fields
, you put the annotation [@@deriving fields]
after the type. ppx_janne
should already be installed as a dependency previously. Recember that if you want its contents available within utop
, you’ll need to run #require "ppx_jane"
. If you don’t, the annotation won’t result in any code being generated.