Contents
Part I An introduction to OCaml
Chapter 1 The core language
1.1 Basics
1.2 Data types
1.3 Functions as values
1.4 Records and variants
1.4.1 Record and variant disambiguation
1.5 Imperative features
1.6 Exceptions
1.7 Lazy expressions
1.8 Symbolic processing of expressions
1.9 Pretty-printing
1.10 Printf formats
1.11 Standalone OCaml programs
Chapter 2 The module system
2.1 Structures
2.2 Signatures
2.3 Functors
2.4 Functors and type abstraction
2.5 Modules and separate compilation
Chapter 3 Objects in OCaml
3.1 Classes and objects
3.2 Immediate objects
3.3 Reference to self
3.4 Initializers
3.5 Virtual methods
3.6 Private methods
3.7 Class interfaces
3.8 Inheritance
3.9 Multiple inheritance
3.10 Parameterized classes
3.11 Polymorphic methods
3.12 Using coercions
3.13 Functional objects
3.14 Cloning objects
3.15 Recursive classes
3.16 Binary methods
3.17 Friends
Chapter 4 Labels and variants
4.1 Labels
4.1.1 Optional arguments
4.1.2 Labels and type inference
4.1.3 Suggestions for labeling
4.2 Polymorphic variants
4.2.1 Weaknesses of polymorphic variants
Chapter 5 Polymorphism and its limitations
5.1 Weak polymorphism and mutation
5.1.1 Weakly polymorphic types
5.1.2 The value restriction
5.1.3 The relaxed value restriction
5.1.4 Variance and value restriction
5.1.5 Abstract data types
5.2 Polymorphic recursion
5.2.1 Explicitly polymorphic annotations
5.2.2 More examples
5.3 Higher-rank polymorphic functions
Chapter 6 Advanced examples with classes and modules
6.1 Extended example: bank accounts
6.2 Simple modules as classes
6.2.1 Strings
6.2.2 Hashtbl
6.2.3 Sets
6.3 The subject/observer pattern
Part II The OCaml language
Chapter 7 The OCaml language
7.1 Lexical conventions
7.2 Values
7.2.1 Base values
7.2.2 Tuples
7.2.3 Records
7.2.4 Arrays
7.2.5 Variant values
7.2.6 Polymorphic variants
7.2.7 Functions
7.2.8 Objects
7.3 Names
7.4 Type expressions
7.5 Constants
7.6 Patterns
7.7 Expressions
7.7.1 Precedence and associativity
7.7.2 Basic expressions
7.7.3 Control structures
7.7.4 Operations on data structures
7.7.5 Operators
7.7.6 Objects
7.7.7 Coercions
7.7.8 Other
7.8 Type and exception definitions
7.8.1 Type definitions
7.8.2 Exception definitions
7.9 Classes
7.9.1 Class types
7.9.2 Class expressions
7.9.3 Class definitions
7.9.4 Class specifications
7.9.5 Class type definitions
7.10 Module types (module specifications)
7.10.1 Simple module types
7.10.2 Signatures
7.10.3 Functor types
7.10.4 The
with
operator
7.11 Module expressions (module implementations)
7.11.1 Simple module expressions
7.11.2 Structures
7.11.3 Functors
7.12 Compilation units
Chapter 8 Language extensions
8.1 Recursive definitions of values
8.2 Recursive modules
8.3 Private types
8.3.1 Private variant and record types
8.3.2 Private type abbreviations
8.3.3 Private row types
8.4 Local opens for patterns
8.5 Locally abstract types
8.6 First-class modules
8.7 Recovering the type of a module
8.8 Substituting inside a signature
8.8.1 Destructive substitutions
8.8.2 Local substitution declarations
8.9 Type-level module aliases
8.10 Overriding in open statements
8.11 Generalized algebraic datatypes
8.12 Syntax for Bigarray access
8.13 Attributes
8.13.1 Built-in attributes
8.14 Extension nodes
8.14.1 Built-in extension nodes
8.15 Extensible variant types
8.15.1 Private extensible variant types
8.16 Generative functors
8.17 Extension-only syntax
8.17.1 Extension operators
8.17.2 Extension literals
8.18 Inline records
8.19 Documentation comments
8.19.1 Floating comments
8.19.2 Item comments
8.19.3 Label comments
8.20 Extended indexing operators
8.21 Empty variant types
8.22 Alerts
8.23 Generalized open statements
8.24 Binding operators
8.24.1 Rationale
Part III The OCaml tools
Chapter 9 Batch compilation (ocamlc)
9.1 Overview of the compiler
9.2 Options
9.3 Modules and the file system
9.4 Common errors
9.5 Warning reference
9.5.1 Warning 9: missing fields in a record pattern
9.5.2 Warning 52: fragile constant pattern
9.5.3 Warning 57: Ambiguous or-pattern variables under guard
Chapter 10 The toplevel system or REPL (ocaml)
10.1 Options
10.2 Toplevel directives
10.3 The toplevel and the module system
10.4 Common errors
10.5 Building custom toplevel systems:
ocamlmktop
10.5.1 Options
10.6 The native toplevel:
ocamlnat
(experimental)
Chapter 11 The runtime system (ocamlrun)
11.1 Overview
11.2 Options
11.3 Dynamic loading of shared libraries
11.4 Common errors
Chapter 12 Native-code compilation (ocamlopt)
12.1 Overview of the compiler
12.2 Options
12.3 Common errors
12.4 Running executables produced by ocamlopt
12.5 Compatibility with the bytecode compiler
Chapter 13 Lexer and parser generators (ocamllex, ocamlyacc)
13.1 Overview of
ocamllex
13.1.1 Options
13.2 Syntax of lexer definitions
13.2.1 Header and trailer
13.2.2 Naming regular expressions
13.2.3 Entry points
13.2.4 Regular expressions
13.2.5 Actions
13.2.6 Variables in regular expressions
13.2.7 Refill handlers
13.2.8 Reserved identifiers
13.3 Overview of
ocamlyacc
13.4 Syntax of grammar definitions
13.4.1 Header and trailer
13.4.2 Declarations
13.4.3 Rules
13.4.4 Error handling
13.5 Options
13.6 A complete example
13.7 Common errors
13.8 Module
Depend
: Module dependencies.
Chapter 14 The browser/editor (ocamlbrowser)
Chapter 15 The documentation generator (ocamldoc)
15.1 Usage
15.1.1 Invocation
15.1.2 Merging of module information
15.1.3 Coding rules
15.2 Syntax of documentation comments
15.2.1 Placement of documentation comments
15.2.2 The Stop special comment
15.2.3 Syntax of documentation comments
15.2.4 Text formatting
15.2.5 Documentation tags (@-tags)
15.3 Custom generators
15.3.1 The generator modules
15.3.2 Handling custom tags
15.4 Adding command line options
15.4.1 Compilation and usage
Chapter 16 The debugger (ocamldebug)
16.1 Compiling for debugging
16.2 Invocation
16.2.1 Starting the debugger
16.2.2 Initialization file
16.2.3 Exiting the debugger
16.3 Commands
16.3.1 Getting help
16.3.2 Accessing the debugger state
16.4 Executing a program
16.4.1 Events
16.4.2 Starting the debugged program
16.4.3 Running the program
16.4.4 Time travel
16.4.5 Killing the program
16.5 Breakpoints
16.6 The call stack
16.7 Examining variable values
16.8 Controlling the debugger
16.8.1 Setting the program name and arguments
16.8.2 How programs are loaded
16.8.3 Search path for files
16.8.4 Working directory
16.8.5 Turning reverse execution on and off
16.8.6 Communication between the debugger and the program
16.8.7 Fine-tuning the debugger
16.8.8 User-defined printers
16.9 Miscellaneous commands
16.10 Running the debugger under Emacs
Chapter 17 Profiling (ocamlprof)
17.1 Compiling for profiling
17.2 Profiling an execution
17.3 Printing profiling information
17.4 Time profiling
Chapter 18 The ocamlbuild compilation manager
Chapter 19 Interfacing C with OCaml
19.1 Overview and compilation information
19.1.1 Declaring primitives
19.1.2 Implementing primitives
19.1.3 Statically linking C code with OCaml code
19.1.4 Dynamically linking C code with OCaml code
19.1.5 Choosing between static linking and dynamic linking
19.1.6 Building standalone custom runtime systems
19.2 The
value
type
19.2.1 Integer values
19.2.2 Blocks
19.2.3 Pointers outside the heap
19.3 Representation of OCaml data types
19.3.1 Atomic types
19.3.2 Tuples and records
19.3.3 Arrays
19.3.4 Concrete data types
19.3.5 Objects
19.3.6 Polymorphic variants
19.4 Operations on values
19.4.1 Kind tests
19.4.2 Operations on integers
19.4.3 Accessing blocks
19.4.4 Allocating blocks
19.4.5 Raising exceptions
19.5 Living in harmony with the garbage collector
19.5.1 Simple interface
19.5.2 Low-level interface
19.6 A complete example
19.7 Advanced topic: callbacks from C to OCaml
19.7.1 Applying OCaml closures from C
19.7.2 Obtaining or registering OCaml closures for use in C functions
19.7.3 Registering OCaml exceptions for use in C functions
19.7.4 Main program in C
19.7.5 Embedding the OCaml code in the C code
19.8 Advanced example with callbacks
19.9 Advanced topic: custom blocks
19.9.1 The
struct custom_operations
19.9.2 Allocating custom blocks
19.9.3 Accessing custom blocks
19.9.4 Writing custom serialization and deserialization functions
19.9.5 Choosing identifiers
19.9.6 Finalized blocks
19.10 Advanced topic: Bigarrays and the OCaml-C interface
19.10.1 Include file
19.10.2 Accessing an OCaml bigarray from C or Fortran
19.10.3 Wrapping a C or Fortran array as an OCaml Bigarray
19.11 Advanced topic: cheaper C call
19.11.1 Passing unboxed values
19.11.2 Direct C call
19.11.3 Example: calling C library functions without indirection
19.12 Advanced topic: multithreading
19.12.1 Registering threads created from C
19.12.2 Parallel execution of long-running C code
19.13 Advanced topic: interfacing with Windows Unicode APIs
19.14 Building mixed C/OCaml libraries:
ocamlmklib
Chapter 20 Optimisation with Flambda
20.1 Overview
20.2 Command-line flags
20.2.1 Specification of optimisation parameters by round
20.3 Inlining
20.3.1 Classic inlining heuristic
20.3.2 Overview of “Flambda” inlining heuristics
20.3.3 Handling of specific language constructs
20.3.4 Inlining reports
20.3.5 Assessment of inlining benefit
20.3.6 Control of speculation
20.4 Specialisation
20.4.1 Assessment of specialisation benefit
20.5 Default settings of parameters
20.5.1 Settings at -O2 optimisation level
20.5.2 Settings at -O3 optimisation level
20.6 Manual control of inlining and specialisation
20.7 Simplification
20.8 Other code motion transformations
20.8.1 Lifting of constants
20.8.2 Lifting of toplevel let bindings
20.9 Unboxing transformations
20.9.1 Unboxing of closure variables
20.9.2 Unboxing of specialised arguments
20.9.3 Unboxing of closures
20.10 Removal of unused code and values
20.10.1 Removal of redundant let expressions
20.10.2 Removal of redundant program constructs
20.10.3 Removal of unused arguments
20.10.4 Removal of unused closure variables
20.11 Other code transformations
20.11.1 Transformation of non-escaping references into mutable variables
20.11.2 Substitution of closure variables for specialised arguments
20.12 Treatment of effects
20.13 Compilation of statically-allocated modules
20.14 Inhibition of optimisation
20.15 Use of unsafe operations
20.16 Glossary
20.17 Module
Spacetime
: Profiling of a program’s space behaviour over time.
Chapter 21 Fuzzing with afl-fuzz
21.1 Overview
21.2 Generating instrumentation
21.2.1 Advanced options
21.3 Example
Chapter 22 Compiler plugins
22.1 Overview
22.2 Basic example
Part IV The OCaml library
Chapter 23 The core library
23.1 Built-in types and predefined exceptions
23.2 Module
Stdlib
: the initially opened module
Chapter 24 The standard library
Chapter 25 The compiler front-end
Chapter 26 The unix library: Unix system calls
Chapter 27 The num library: arbitrary-precision rational arithmetic
Chapter 28 The str library: regular expressions and string processing
Chapter 29 The threads library
Chapter 30 The graphics library
Chapter 31 The dynlink library: dynamic loading and linking of object files
Chapter 32 The bigarray library
Part V Appendix