---
# System prepended metadata

title: 対話型インタプリタのディレクティブ（`#...`）が便利
tags: [public-tech]

---

---
breaks: false
tags: public-tech
---

# 対話型インタプリタのディレクティブ（`#...`）が便利

この記事は [OCaml Tips Advent Calendar 2022](https://adventar.org/calendars/8396) の15日目です。

`ocaml` コマンドや `utop` コマンドで起動できる対話型インタプリタでは
`#` から始まるディレクティブを使うことで、インタプリタに特殊な動作をさせる
ことができます。一覧は公式ドキュメントに[あります](https://v2.ocaml.org/manual/toplevel.html)が、
その中からいくつか便利なものを抜粋します。

- `#quit;;`
    - インタプリタを終了させる[^quit]。
- `#help;;`
    - ディレクティブの一覧を表示する。
- `#use "file-name";;`
    - 指定した OCaml コードをインタプリタ内に読み込む。`dune utop` を使うまでもないときに便利。
- `#trace function-name;;`
    - 指定した関数のトレース（呼び出し時の引数と戻り値）を出力する。（単純な）再帰関数の挙動を調べるのに便利で、例えば次のように使用する。
```
# let rec fib n = if n <= 1 then n else fib (n - 1) + fib (n - 2);;
val fib : int -> int = <fun>

# #trace fib;;
fib is now traced.

# fib 10;;

# #untrace fib;; (* トレースをやめる *)
```

[^quit]: ほかに `Ctrl+D` でも（EOF を発行して）終了させられます。

`utop` コマンドでのみ使えるディレクティブとしては、次のようなものがあります。

- `#require "package-name";;`
    - 指定した（外部）パッケージを読み込む。

## 参考

- https://v2.ocaml.org/manual/toplevel.html
