-
Notifications
You must be signed in to change notification settings - Fork 344
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Up and running with OCaml #1165
Changes from 10 commits
671d231
32a1d31
0f6030c
3f008b0
6e61dd6
dba99aa
68dbdb9
02597c2
61475c1
adbe914
ff384c4
944d524
27edb03
23cd15d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,230 @@ | ||||||
<!-- ((! set title Up and Running with OCaml !)) ((! set learn !)) --> | ||||||
|
||||||
*Table of contents* | ||||||
|
||||||
# Up and Running with OCaml | ||||||
|
||||||
This page will help you install OCaml, the Dune build system, and support for | ||||||
your favourite text editor or IDE. These instructions work on Windows, Unix | ||||||
systems like Linux, and MacOS. | ||||||
|
||||||
## Installing OCaml | ||||||
|
||||||
There are two procedures: one for Unix-like systems, and one for Windows. | ||||||
|
||||||
### For Linux and MacOS | ||||||
|
||||||
We will install OCaml using OPAM, the OCaml package manager. OPAM will also be | ||||||
used when we wish to install third-party OCaml libraries. | ||||||
|
||||||
**For MacOS** | ||||||
|
||||||
``` | ||||||
# Homebrew | ||||||
brew install gpatch | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why is this There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I took the MacOS instructions from here: https://opam.ocaml.org/doc/Install.html So if they are out of date, we need to fix them there too. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I have asked for an update here: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, I have removed the instruction on the assumption your patch will be approved. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. PR for the opam install page: |
||||||
brew install opam | ||||||
|
||||||
# MacPort | ||||||
port install opam | ||||||
``` | ||||||
|
||||||
**For Linux** the preferred way is to use your system's package manager on | ||||||
Linux (e.g `apt-get install opam` or similar). [Details of all installation | ||||||
methods.](https://opam.ocaml.org/doc/Install.html) | ||||||
|
||||||
Then, we install an OCaml compiler: | ||||||
|
||||||
``` | ||||||
# environment setup | ||||||
opam init | ||||||
eval `opam env` | ||||||
|
||||||
# install given version of the compiler | ||||||
opam switch create 4.11.1 | ||||||
eval `opam env` | ||||||
``` | ||||||
|
||||||
Now, OCaml is up and running: | ||||||
|
||||||
``` | ||||||
$ which ocaml | ||||||
/Users/frank/.opam/4.11.1/bin/ocaml | ||||||
|
||||||
$ ocaml -version | ||||||
The OCaml toplevel, version 4.11.1 | ||||||
``` | ||||||
|
||||||
**For either Linux or MacOS** as an alternative, a binary distribution of OPAM is | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
available: | ||||||
|
||||||
``` | ||||||
sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh) | ||||||
``` | ||||||
|
||||||
### For Windows | ||||||
|
||||||
We use the [OCaml for Windows](https://fdopen.github.io/opam-repository-mingw/) | ||||||
installer which comes in 32bit and 64bit versions. This installer gives you | ||||||
OPAM and OCaml installations all in one go. It is used from within a Cygwin | ||||||
environment, but the executables produced have no dependency on Cygwin at all. | ||||||
|
||||||
## The OCaml top level | ||||||
|
||||||
OCaml comes with two compilers: for native code, and for byte code. We shall | ||||||
use one of those in a moment. But first, let's use OCaml's top level (sometimes | ||||||
known as a REPL in other languages): | ||||||
|
||||||
``` | ||||||
$ ocaml | ||||||
OCaml version 4.11.1 | ||||||
|
||||||
# 1 + 2 * 3;; | ||||||
- : int = 7 | ||||||
|
||||||
``` | ||||||
|
||||||
We typed the phrase `1 + 2 * 3` and then signalled to OCaml that we had | ||||||
finished by typing `;;` followed by the Enter key. OCaml calculated the | ||||||
result, `7` and its type `int` and showed them to us. We exit by running the | ||||||
built-in `exit` function with exit code 0: | ||||||
|
||||||
``` | ||||||
$ ocaml | ||||||
OCaml version 4.11.1 | ||||||
|
||||||
# 1 + 2 * 3;; | ||||||
- : int = 7 | ||||||
# exit 0;; | ||||||
$ | ||||||
``` | ||||||
|
||||||
There are two ways to improve your experience with the OCaml top level: you can | ||||||
install the popular [`rlwrap`](https://github.com/hanslub42/rlwrap) on your | ||||||
system and invoke `rlwrap ocaml` instead of `ocaml` to get line-editing | ||||||
facilities inside the OCaml top level, or you can install the alternative top | ||||||
level `utop` using OPAM: | ||||||
|
||||||
``` | ||||||
$ opam install utop | ||||||
``` | ||||||
|
||||||
We run it by typing `utop` instead of `ocaml`. You can read more about | ||||||
[utop](https://github.com/ocaml-community/utop). | ||||||
|
||||||
## Installing the Dune build system | ||||||
|
||||||
Dune is a build system for OCaml. It takes care of all the low level details of | ||||||
OCaml compilation. We install it with OPAM: | ||||||
|
||||||
``` | ||||||
$ opam install dune | ||||||
The following actions will be performed: | ||||||
- install dune 2.7.1 | ||||||
|
||||||
<><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><> | ||||||
[default] https://opam.ocaml.org/2.0.7/archives/dune.2.7.1+opam.tar.gz | ||||||
downloaded | ||||||
|
||||||
<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><> | ||||||
-> installed dune.2.7.1 | ||||||
Done. | ||||||
``` | ||||||
|
||||||
## A first project | ||||||
|
||||||
Let's begin the simplest project with Dune and OCaml. We create a new directory | ||||||
and ask `dune` to initialise a new project: | ||||||
|
||||||
``` | ||||||
$ mkdir helloworld | ||||||
$ cd helloworld/ | ||||||
$ dune init exe helloworld | ||||||
Success: initialized executable component named helloworld | ||||||
``` | ||||||
|
||||||
Building our program is as simple as typing `dune build`: | ||||||
|
||||||
``` | ||||||
$ dune build | ||||||
Info: Creating file dune-project with this contents: | ||||||
| (lang dune 2.7) | ||||||
Done: 8/11 (jobs: 1) | ||||||
``` | ||||||
|
||||||
When we change our program, we type `dune build` again to make a new | ||||||
executable. We can run the executable with `dune exec` (it's called | ||||||
`helloworld.exe` even when we're not using Windows): | ||||||
|
||||||
``` | ||||||
$ dune exec ./helloworld.exe | ||||||
Hello, World! | ||||||
``` | ||||||
|
||||||
Let's look at the contents of our new directory. Dune has added the | ||||||
`helloworld.ml` file, which is our OCaml program. It has also added our `dune` | ||||||
file, which tells dune how to build the program, and a `_build` subdirectory, | ||||||
which is dune's working space. | ||||||
|
||||||
``` | ||||||
$ ls | ||||||
_build dune helloworld.ml | ||||||
``` | ||||||
|
||||||
The `helloworld.exe` executable is stored inside the `_build` structure, so | ||||||
it's easier to run with `dune exec`. To ship the executable, we can just copy | ||||||
it from inside `_build` to somewhere else. | ||||||
|
||||||
Here is the contents of the automatically-generated `dune` file. When we want | ||||||
to add components to your project, such as third-party libraries, we edit this | ||||||
file. | ||||||
|
||||||
``` | ||||||
(executable | ||||||
(name helloworld)) | ||||||
``` | ||||||
|
||||||
## Editor support for OCaml | ||||||
|
||||||
For **Visual Studio Code**, and other editors support the Language Server | ||||||
Protocol, the OCaml language server can by installed with OPAM: | ||||||
|
||||||
``` | ||||||
$ opam pin add ocaml-lsp-server https://github.com/ocaml/ocaml-lsp.git | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This pin is no longer necessary, as lsp has been released into opam |
||||||
$ opam install ocaml-lsp-server | ||||||
``` | ||||||
|
||||||
Now, we install the OCaml Platform Visual Studio Code extension from the Visual | ||||||
Studio Marketplace. | ||||||
|
||||||
Upon first loading an OCaml source file, you may be prompted to select the | ||||||
toolchain in use: pick OCaml the version of OCaml you are using, e.g. 4.11.1 | ||||||
from the list. Now, help is available by hovering over symbols in your program: | ||||||
|
||||||
![Visual Studio Code](/img/vscode.png "") | ||||||
|
||||||
**On Windows**, we must launch Visual Studio Code from within the Cygwin window, | ||||||
rather than by clicking on its icon (otherwise, the language server will not be | ||||||
found): | ||||||
|
||||||
``` | ||||||
$ /cygdrive/c/Users/Frank\ Smith/AppData/Local/Programs/Microsoft\ VS\ Code/Code.exe | ||||||
``` | ||||||
|
||||||
**For Vim and Emacs**, install the [Merlin](https://github.com/ocaml/merlin) | ||||||
system using OPAM: | ||||||
|
||||||
``` | ||||||
$ opam install merlin | ||||||
``` | ||||||
|
||||||
The installation procedure will print instructions on how to link Merlin with | ||||||
your editor. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think it would be worth it to mention There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The documentation is what Is Do you suggest just mentioning it, or making it the default instruction? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The reader cannot infer how involved is the remaining installation procedure with just a "Follow the printed instructions". And opam user-setup install There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks. What's the Windows status? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm happy to deal with this in a followup PR, as I suspect noone is entirely sure what the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. opam user-setup seems to start on windows, but displays some error messages and tries to detect ocamltop, emacs, vim, gedit and sublime3. I don't think it does something windows specific at the moment. |
||||||
|
||||||
**On Windows**, when using Vim, the default cygwin Vim will not work with | ||||||
Merlin. You will need install Vim separately. In addition to the usual | ||||||
instructions printed when installing Merlin, you may need to set the PATH in | ||||||
Vim: | ||||||
|
||||||
``` | ||||||
let $PATH .= ";".substitute(system('opam config var bin'),'\n$','','''') | ||||||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
opam should be lower case