obeamのtype_t逆引き対応表

## obeamとは

Erlangの静的解析をするときに便利なobeamというライブラリがある。 `erl +debug_info` でコンパイルしたbeamファイルに内包される構文木を引っ張ってきてくれるocamlのライブラリだ。opamにも登録されているので簡単に `opam install obeam` できる。

- https://github.com/yutopp/obeam

## 逆引き対応表

obeamの `Abstract_format.type_t` で提供される構造がぱっとわからない時があるので逆引き対応表を作ってみた。
基本的には http://erlang.org/doc/reference_manual/typespec.html で定められている型式を順番に調べた。

### syntax for typesの表にある型

| Erlangの型式 | Abstract Format の type_t |
|:-----------|------------:|
| `any()` | `TyPredef(_, "any", [])` |
| `none()` | `TyPredef(_, "none", [])` |
| `pid()` | `TyPredef(_, "pid", [])` |
| `port()` | `TyPredef(_, "port", [])` |
| `reference()` | `TyPredef(_, "reference", [])` |
| `[]` | `TyPredef(_, "nil", [])` |
| `atom()` | `TyPredef(_, "atom", [])` |
| `'ok'` | `TyLit(LitAtom(_, "ok"))` |
| `<<>>` | `TyBitstring(_, TyLit(LitInteger(_, 0)), TyLit(LitInteger(_, 0)))` |
| `<<_:1, _:_*2>>` | `TyBitstring(_, TyLit(LitInteger(_, 1)), TyLit(LitInteger(_, 2)))` |
| `float()` | `TyPredef(_, "float", [])` |
| `integer()` | `TyPredef(_, "integer", [])` |
| `42` | `TyLit(LitInteger(_, 42))` |
| `$a` | (* 未実装 *) |
| `1 + 2` | `TyBinOp(_, TyLit(LitInteger(_, 1)), "+", TyLit(LitIntegr(_, 2)))` |
| `bnot 0` | `TyUnaryOp(_, "bnot", TyLit(LitAtom(_, 0)))` |
| `1..12` | `TyRange(_, TyLit(LitInteger(_, 1)), TyLit(LitInteger(_, 12)))` |
| `fun()` | `TyFunAny _` |
| `fun((...) -> ok)` | `TyFunAnyArity(_, _, TyLit(LitAtom(_, "ok")))` |
| `fun((atom()) -> ok)` | `TyFun(_, _, [TyPredef(_, "atom", [])], TyLit(LitAtom(_, "ok")))` |
| `list(atom())` | `TyPredef(_, "list", [TyPredef(_, "atom", [])])` |
| `maybe_improper_list(number(), atom())` | `TyPredef(_, "maybe_improper_list", [...])` |
| `nonempty_improper_list(number(), atom())` | `TyPredef(_, "nonempty_improper_list", [...])` |
| `nonempty_list(atom())` | `TyPredef(_, "nonempty_list", [...])` |
| `map()` | `TyAnyMap _` |
| `#{}` | `TyMap(_, [])` |
| `#{'foo' := number(), 'bar' => atom()}` | `TyMap(_, [TyAssocExact(...); TyAssoc(...)])` |
| `tuple()` | `TyAnyTuple _` |
| `{}` | `TyTuple(_, [])` |
| `{atom()}` | `TyTuple(_, [TyPredef(_, "atom", [])])` |
| `undefined ｜ number()` | `TyUnion(_, [TyLit(LitAtom(_, "undefined")); TyPredef(_, "number", [])])` |
| `foo(number()` | `TyUser(_, "foo", [TyPredef(_, "number", [])])` |

### 表7.1のBuilt-in types

| Erlangの型式 | Abstract Format の type_t |
|:-----------|------------:|
| `term()` | `TyPredef(_, "term", [])` |
| `binary()` | `TyPredef(_, "binary", [])` |
| `bitstring()` | `TyPredef(_, "bitstring", [])` |
| `boolean()` | `TyPredef(_, "boolean", [])` |
| `byte()` | `TyPredef(_, "byte", [])` |
| `char()` | `TyPredef(_, "char", [])` |
| `nil()` | `TyPredef(_, "nil", [])` |
| `number()` | `TyPredef(_, "number", [])` |
| `list()` | `TyPredef(_, "list", [])` |
| `maybe_improper_list()` | `TyPredef(_, "maybe_improper_list", [])` |
| `nonempty_list()` | `TyPredef(_, "nonempty_list", [])` |
| `string()` | `TyPredef(_, "string", [])` |
| `nonempty_string()` | `TyPredef(_, "nonempty_string", [])` |
| `iodata()` | `TyPredef(_, "iodata", [])` |
| `iolist()` | `TyPredef(_, "iolist", [])` |
| `function()` | `TyPredef(_, "function", [])` |
| `module()` | `TyPredef(_, "module", [])` |
| `mfa()` | `TyPredef(_, "mfa", [])` |
| `arity()` | `TyPredef(_, "arity", [])` |
| `identifier` | `TyPredef(_, "identifier", [])` |
| `node()` | `TyPredef(_, "node", [])` |
| `timeout()` | `TyPredef(_, "timeout", [])` |
| `no_return()` | `TyPredef(_, "no_return", [])` |