/ / Ocaml-コンパイラとマニュアルの違い-コンパイラ構築、ocaml

Ocaml - コンパイラとマニュアルの違い - コンパイラ構築、ocaml

だから私は読んでいた http://www.podval.org/~sds/ocaml-sucks.html、この引用を含む(ocamlの問題のコンテキストで):

実際には、わずかに異なる3つの構文があります。

  • 公式のものはマニュアルに記載されています
  • そのスーパーセットは、コンパイラocamlcによって受け入れられます
  • 類似したもの異なる)プリプロセッサCamlp4によって受け入れられます(たとえば、List.map [1; 2; 3]を受け入れます) 〜f:fun x-> x。トップレベルでも受け入れられますが、受け入れられません。 コンパイラ)

ocamlcで受け入れられるが、マニュアルと一致しないocamlコードフラグメントの例は何ですか?

PS-私は主にOCaml 4.00.1に興味がありますが、以前のバージョンも興味深いです...

回答:

回答№1は5

好奇心のみを目的とした面白い例:

                  OCaml version 4.00.0

# type "a weird_list =
| ()
| :: of "a * "a weird_list;;
type "a weird_list = () | :: of "a * "a weird_list
# 1::2::3::();;
- : int weird_list = :: (1, :: (2, :: (3, ())))

Camlp4とOCamlの違いコンパイラは時々バグですが、ほとんどの場合、パーサー技術の違いによって説明されます:穏やかな迷惑な構文の微妙さで同じ言語の慣用的なLRパーサーとLLパーサーを書く場合、両方が完全に一致することを期待すべきではありません。これは実際には問題ではないと思います(しかし、実際にはほとんどの人はCamlp4を使用しません)。


回答№2については2

このページはかなり古いですが、確かではありませんが、すべてのポイントに当てはまります。

3番目の項目は、ocaml 4.00トップレベルを考慮してfalseです(List.mapのパラメーターの順序が間違っていることも考慮してください...):

 $ List.map  ~f:fun x -> x [1;2;3];;
Error: Syntax error
$ List.map ~f:(fun x -> x) [1;2;3];;
File "", line 1, characters  12-24:
Error: The function applied to this argument has type "a list -> "b list
This argument cannot be applied with label ~f

知る限り、トップレベルはocamlと同じコードを使用してコードを解析します...