Semantic Model (part 5) Ok, that was a bit of a simplification. What we're really going to do is construct a function which constructs the rule tree. The example is more like this: let rec lisp_o _ = let targ = "lisp.o" in let dep_names = List.flatten [ ["lisp.c"] ] in let deps = List.map resolve dep_names in let actions = [String.concat " " (List.flatten [ ["gcc"]; ["-c"]; [List.hd dep_names] ]) ] in Rule (targ, deps, actions) and emacs _ = let targ = "emacs" in let dep_names = List.flatten [ "emacs.c"; "lisp.o"; "buffer.h"] in let deps = List.map resolve dep_names in let actions = [String.concat " " (List.flatten [ ["gcc"]; ["-o"]; targ; ["emacs.c"]; ["lisp.o"] ]) ] in Rule (targ, deps, actions)