4809
OCaml で ppx コマンドを呼び出す際に

```

    ocaml -ppx `ocamlfind printconf path`/ppx_test/ppx_test
    
```

として ppx コマンドを指定しているのですが、より良い方法はありませんか？

※ 環境は Mac OS X です。ppx は OPAM からインストールしています。

### 追記

```

    $ ocamlfind ocaml -package ppx_test
    
```

または、

```

    $ ocamlfind ocaml -package ppx_test/ppx_test
    
```

と入力したのですが以下のように表示されてしまいます。

```

    Usage: ocamlfind query [-help | other options] ...
    or: ocamlfind ocamlc [-help | other options] ...
    or: ocamlfind ocamlcp [-help | other options] ...
    or: ocamlfind ocamlmklib [-help | other options] ...
    or: ocamlfind ocamlmktop [-help | other options] ...
    or: ocamlfind ocamlopt [-help | other options] ...
    or: ocamlfind ocamloptp [-help | other options] ...
    or: ocamlfind ocamldep [-help | other options] ...
    or: ocamlfind ocamlbrowser [-help | other options]
    or: ocamlfind ocamldoc [-help | other options] ...
    or: ocamlfind install [-help | other options] ...
    or: ocamlfind remove [-help | other options] 
    or: ocamlfind printconf [-help] [variable]
    or: ocamlfind list
    or: ocamlfind pkg/cmd arg ...
    Select toolchain with:
    ocamlfind -toolchain 
    Abbreviations:
    e.g. ocamlfind opt instead of ocamlfind ocamlopt
    
```

`opam list` で見ると、ocamlfind のバージョンは

ocamlfind 1.5.5 A library manager for OCaml

です。Mac OS X で対応していない、あるいは、ocamlfind のバージョンが古いのでしょうか？
CC BY-SA 3.0
2015-01-19T01:41:14.113
4806
2017-08-14T02:28:09.430
2017-08-14T02:28:09.430
19110
7532
question
ocaml
ppx コマンドの簡単な呼び方を教えてください
ppx コマンドは ocamlfind の `-package` オプションで簡単に呼び出すことができます:

```

    ocamlfind ocamlc -package パッケージ名
    
```

と指定すると、 ocamlfind はコンパイルコマンド `-ppx ppxコマンドの絶対パス` を付けて実行します。

ただしこれには条件があって、 ppx コマンドが ocamlfind パッケージとして「正しく」インストールされている必要があります

  * ppx コマンドが `ocamlfind query パッケージ` のディレクトリにインストールされていること
  * パッケージの `META` ファイル中に `ppx=./コマンド名` という情報があること

`ppx` フィールどの値は `./` で始まっていない場合、パス展開は行われません。特段の事情がない限り `./` のない `ppx`
フィールドは不便なだけなのでそのような `META` を配っているパッケージにはバグレポートするのが良いと思います。

## toplevel について

`ocaml` toplevel については `ocamlfind ocaml`
というラップ自体が無いので、上の方法は使えません。（これは、なぜだか正直私にはわかりませんが）次のように toplevel から手でロードします

```

    ocaml
    # #use "topfind";;
    # #require "ppx_test";;   (* ppx を含むパッケージのロード *)
    
```

この結果

```

    絶対パス/./ppx_test: activated
    
```

と出ると ppx が使用されるようロードされた状態になります:

```

    # _with_location_ 4;;
    - : int * Ppx_test.Location.t =
    (4,
     {Ppx_test.Location.loc_start =
       {Lexing.pos_fname = "//toplevel//"; pos_lnum = 1; pos_bol = 0;
        pos_cnum = 16};
      loc_end =
       {Lexing.pos_fname = "//toplevel//"; pos_lnum = 1; pos_bol = 0;
        pos_cnum = 17};
      loc_ghost = false})
    
```

繰り返し使う場合は ocamlinit ( <http://caml.inria.fr/pub/docs/manual-
ocaml-400/manual023.html> )を使うことになります。

よりくわしくは findlib のマニュアルで ppx を検索してご覧ください
<http://projects.camlcity.org/projects/dl/findlib-1.5.5/doc/ref-
html/r700.html>
CC BY-SA 3.0
2015-01-19T02:24:09.867
4809
2015-01-19T05:58:21.200
2015-01-19T05:58:21.200
898
898
4806
answer